概念
只需几个概念,就能理解 Usher 中的几乎一切:各种东西存放在哪里、由谁签发令牌、用户在哪里登录,以及每种令牌的有效期有多长。
工作区、项目和环境
- 工作区是你的团队或公司在 Usher Console 中的所在。它的成员和审计日志都归属于它。
- 项目是一个产品:你的 Web App,或者一个合作伙伴门户。一个工作区可以包含多个项目。
- 环境是一个项目的一份运行副本,通常是 development(开发)和 production(生产)。用户、应用、密钥和设置都存放在环境中。
工作区 · Acme Ltd
项目 · Web
- development · wise-otter-42
- production · acme
项目 · 合作伙伴门户
- development · calm-heron-17
- production · acme-partners
环境之间不共享任何要紧的东西。每个环境都有自己的 Postgres 架构、自己的签名密钥,以及在自己的数据密钥下密封的机密。在开发环境中注册的人,在生产环境中并不存在;一个环境签发的令牌,也永远无法用另一个环境的密钥验证。
工作区管理员可以在项目“概览”页面的末尾,输入项目名称后删除该项目。项目中的每个环境都会同时删除:其中的用户、应用、密钥和设置,以及它签发的每个会话和令牌。项目的地址将不再响应,也永远不会再分配出去,因此仍然信任其中某个地址的 App,不会被别人的项目欺骗。
颁发者
每个环境都是一个独立的 OpenID Connect 颁发者,位于租户域名上属于它自己的主机:
https://<handle>.usherid.com- 生产环境使用你自己选择的标识名(handle):3 到 32 个小写字母、数字和不连续的连字符,例如你公司的名称。标识名一经使用,就永远不会再分配出去。
- 开发环境会获得一个随机标识名,例如
wise-otter-42,任何人都不会把它误认作某个品牌。
颁发者在创建环境时就已确定,因为它签发的每个令牌都会在 iss 中写明它,而每个信任它的 App 都会核对这个值。
租户域名与 Usher 自己的域名(usheridentity.com)是不同的可注册域名,因此客户的登录页面与 Usher Console 永远不会同站;而且 Cookie 仅限主机使用:浏览器只会把一个环境的 Cookie 发送给该环境本身。
Lobby
Lobby 是每个环境在其颁发者地址上托管的登录页面。你的 App 把用户送到这里,Lobby 让他们登录,再把他们送回来。
- 它总会在“即将前往”标签中写明用户要前往的 App。
- 它只提供环境允许的登录方式:通行密钥、电子邮件验证码、魔法链接、社交账户(Google、GitHub、Microsoft、Apple)和密码。
- 它可以要求第二重验证:身份验证器 App(附带备用码)或通行密钥。
- 它可以向所有人开放,也可以只对宾客名单上的地址和域名开放。
无论用户来自哪个产品,它看起来都一样。这是有意为之:用户会熟悉真正的 Lobby 是什么样子,并在某个页面不是 Lobby 时察觉出来。
Usher 账户
大多数环境都有自己的用户。Usher 账户则不同:一个账户即可登录所有提供“通过 Usher 继续”的 App。用户可以在 account.usheridentity.com 管理自己的账户。
令牌和有效期
| 令牌 | 默认值 | 可设置范围 | 用途 |
|---|---|---|---|
| 授权码 | 5 分钟 | 固定 | 用于换取令牌。仅限使用一次。 |
| ID 令牌 | 10 分钟 | 1 至 60 分钟 | 告诉你的 App 是谁登录了。不用于调用 API。 |
| 访问令牌 | 10 分钟 | 1 至 60 分钟 | 发送给你的 API,由 API 进行校验。 |
| 刷新令牌 | 30 天 | 1 至 90 天 | 用于获取新的访问令牌。每次使用都会轮换。需要 offline_access。 |
| 机器访问令牌 | 15 分钟 | 1 至 60 分钟 | 用于 client_credentials:背后没有用户的服务器。 |
| 电子邮件验证码、魔法链接 | 10 分钟 | 固定 | 用于单次登录。验证码最多可尝试三次。 |
Lobby 中的会话也有有效期:连续 7 天未使用(可设为 1 至 30 天)会话即结束,总时长满 30 天(可设为 1 至 90 天)也会结束。更改敏感信息(例如电子邮件地址)时,需要在过去 10 分钟内登录过。
签名密钥
令牌默认使用 RS256 签名;环境也可以改用 ES256 或 EdDSA。公钥会发布在环境的 jwks_uri 上,你使用的库会自行获取,并在密钥轮换时取得新的密钥。
范围
| 范围 | 你的 App 会收到什么 |
|---|---|
openid | 必需。一个包含该用户 sub 的 ID 令牌。 |
profile | 用户的姓名和头像。 |
email | 用户的电子邮件地址,以及它是否已验证。 |
offline_access | 一个刷新令牌,让用户保持登录。 |