Multiple SSO Identity Providers
parent
7ff9be4fee
commit
204732099b
@ -0,0 +1,92 @@
|
||||
# MSC2857: 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": "mxc://..."
|
||||
},
|
||||
{
|
||||
"id": "github",
|
||||
"name": "Github",
|
||||
"icon": "mxc://..."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "m.login.token"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
## Potential issues
|
||||
|
||||
None discovered at this time
|
||||
|
||||
|
||||
## Alternatives
|
||||
|
||||
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 `msc2857.identity_providers` for the flow discovery and `/unstable`
|
||||
for the new endpoints.
|
||||
|
Loading…
Reference in New Issue