-
Notifications
You must be signed in to change notification settings - Fork 399
MSC2858: Multiple SSO Identity Providers #2858
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 7 commits
Commits
Show all changes
31 commits
Select commit
Hold shift + click to select a range
2047320
Multiple SSO Identity Providers
t3chguy a7eba77
Fix MSC number
t3chguy 2064536
Update proposals/2858-Multiple-SSO-Identity-Providers.md
t3chguy a391a4a
Iterate the MSC
t3chguy 874e32d
Merge remote-tracking branch 'origin/t3chguy/msc/multi-sso' into t3ch…
t3chguy f444273
be stricter on the icon url
t3chguy 8ac2359
Iterate MSC based on feedback
t3chguy 153c557
Add more explanation
t3chguy c7063a4
Iterate PR based on feedback
t3chguy 8be6540
Update proposals/2858-Multiple-SSO-Identity-Providers.md
t3chguy 85ccf93
Remove UIA stuff
t3chguy 1d90cac
Merge branch 't3chguy/msc/multi-sso' of github.com:matrix-org/matrix-…
t3chguy 277ff68
Formatting tweaks
richvdh 0c18f83
grammar clarifications
richvdh 09d41c5
add 'brand'
richvdh 8434605
Update proposals/2858-Multiple-SSO-Identity-Providers.md
richvdh ba08c9f
notes on and alternatives
richvdh 6badb3b
Notes on OAuth2 and unknown idps
richvdh ba3e204
Update proposals/2858-Multiple-SSO-Identity-Providers.md
t3chguy dce9c9f
Move the idp `brand` assignments out to a registry
richvdh 434d686
fix up markdown
richvdh 2d4da14
more fix markdown
richvdh 9a4e821
fix link
richvdh 62cc76f
Move sequence diagram into doc
richvdh a596efd
Get rid of the registry for now
richvdh 178cbe1
Update proposals/2858-Multiple-SSO-Identity-Providers.md
richvdh 1ba0c39
Change the brand identifiers again
richvdh 7871da7
Update proposals/2858-Multiple-SSO-Identity-Providers.md
richvdh d5166eb
Update proposals/2858-Multiple-SSO-Identity-Providers.md
richvdh 49f7624
update brand descriptions
richvdh a8a7acc
update UIA
richvdh File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
# MSC2858: Multiple SSO Identity Providers | ||
|
||
Matrix already has generic SSO support, but it does not yield the best user experience especially for | ||
instances which wish to offer multiple identity providers. This MSC provides a simple and fully | ||
backwards compatible way to extend the current spec which would allow clients to give users options | ||
like `Continue with Google` and `Continue with Github` side-by-side. | ||
|
||
|
||
## Proposal | ||
|
||
Currently, Matrix supports `m.login.sso`, `m.login.token` and `/login/sso/redirect` for clients to | ||
pass their user to the configured Identity provider and for them to come back with something which | ||
is exchangeable for a Matrix access token. This flow offers no insight to the user as to what | ||
Identity providers are available. It allows clients to offer a super generic `Sign in with SSO` | ||
button only. | ||
|
||
By augmenting the `m.login.sso` flow discovery definition to include metadata on the supported IDPs | ||
the client can show a button for each of the supported providers, yielding a much more usable | ||
experience. This would look like this: | ||
|
||
```json | ||
{ | ||
"flows": [ | ||
{ | ||
"type": "m.login.sso", | ||
"identity_providers": [ | ||
{ | ||
"id": "google", | ||
"name": "Google", | ||
"icon": "https://..." | ||
t3chguy marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}, | ||
{ | ||
"id": "github", | ||
"name": "Github", | ||
"icon": "https://..." | ||
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
] | ||
}, | ||
{ | ||
"type": "m.login.token" | ||
} | ||
] | ||
} | ||
``` | ||
|
||
The `id` field would be opaque with the accepted characters matching unreserved URI characters | ||
as defined in [RFC3986](http://www.ietf.org/rfc/rfc3986.txt) - this was chosen to avoid | ||
having to encode special characters in the URL. Max length 128. Defined as: | ||
``` | ||
ALPHA DIGIT "-" / "." / "_" / "~" | ||
``` | ||
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
The `name` field should be the human readable string intended for printing by the client. | ||
|
||
The `icon` field is the only optional field and should point to an icon representing the IdP. | ||
t3chguy marked this conversation as resolved.
Show resolved
Hide resolved
|
||
If present then it must be an HTTPS URL to an image resource. This should be hosted by the | ||
homeserver service provider to not leak the client's IP address unnecessarily. | ||
t3chguy marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
|
||
A new endpoint would be needed to support redirecting directly to one of the IDPs: | ||
|
||
`GET /_matrix/client/r0/login/sso/redirect/{idp_id}` | ||
|
||
This would behave identically to the existing endpoint without the last argument | ||
except would allow the server to forward the user directly to the correct IdP. | ||
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
For the case of backwards compatibility the existing endpoint should remain, | ||
and if the server supports multiple SSO IDPs it should offer the user a page | ||
which lets them choose between the available IdP options as a fallback. | ||
t3chguy marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
For the case of User Interactive Auth the server would just give the appropriate | ||
identity provider as an option, that being the same as the user used to login with. | ||
t3chguy marked this conversation as resolved.
Show resolved
Hide resolved
|
||
An example UIA 401 response is shown below: | ||
```json | ||
{ | ||
"session": "session_id", | ||
"flows":[ | ||
{ | ||
"stages": ["m.login.sso"] | ||
} | ||
], | ||
"params": { | ||
"m.login.sso": { | ||
"identity_providers": [ | ||
{ | ||
"id": "google", | ||
"name": "Google", | ||
"icon": "https://..." | ||
} | ||
] | ||
} | ||
} | ||
} | ||
``` | ||
|
||
The exact format of `identity_providers` is kept between Login flows and UIA, | ||
this allows better code reuse and in future for multiple IdPs to map to the | ||
same Matrix account and the user having the ability to use either to complete | ||
UIA. | ||
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
|
||
## Potential issues | ||
|
||
None discovered at this time | ||
|
||
|
||
## Alternatives | ||
t3chguy marked this conversation as resolved.
Show resolved
Hide resolved
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
An alternative to the whole approach would be to allow `m.login.sso.$idp` but this forces | ||
treating an opaque identifier as hierarchical and offers worse backwards compatibility. | ||
|
||
An alternative to the proposed backwards compatibility plan where the server offers a | ||
fallback page which fills the gap and lets the user choose which SSO IdP they need is | ||
for the server to deterministically always pick one, maybe the first option and let | ||
old clients only auth via that one but that means potentially locking users out of their | ||
accounts. | ||
|
||
|
||
## Security considerations | ||
|
||
This could potentially aid phishing attacks by bad homeservers, where if the app says | ||
`Continue with Google` and then they are taken to a page which is styled to look like | ||
the Google login page they might be a tiny bit more susceptible to being phished as opposed | ||
as to when they click a more generic `Sign in with SSO` button, but this attack was possible | ||
anyhow using a different vector of a controlled Element/client instance which modifies | ||
the text. | ||
|
||
|
||
## Unstable prefix | ||
|
||
Whilst in development use `org.matrix.msc2858.identity_providers` for the flow discovery and `/_matrix/client/unstable/org.matrix.msc2858/login/sso/redirect/{idp_id}` | ||
for the new endpoints. | ||
richvdh marked this conversation as resolved.
Show resolved
Hide resolved
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.