概念
只要掌握幾個概念,就能理解 Usher 的幾乎一切:東西存放在哪裡、由誰簽發權杖、用户在哪裡登入,以及每種權杖的有效期有多長。
工作區、項目與環境
- 工作區是你在 Usher Console 中的團隊或公司。它的成員和審計記錄都屬於它。
- 項目是一項產品:你的網頁 App,或合作夥伴入口網站。一個工作區可以包含許多項目。
- 環境是項目的一份執行中的副本,通常是開發環境(development)和正式環境(production)。用户、應用程式、密鑰和設定都存放在環境中。
工作區 · Acme Ltd
項目 · Web
- development · wise-otter-42
- production · acme
項目 · 合作夥伴入口網站
- development · calm-heron-17
- production · acme-partners
環境之間沒有共用任何重要的東西。每個環境都有自己的 Postgres schema、自己的簽署密鑰,以及以自己的資料密鑰密封的機密。在開發環境中註冊的用户,在正式環境中並不存在;一個環境的權杖,也永遠無法用另一個環境的密鑰驗證。
工作區管理員可以在項目「概覽」頁面的最後,輸入項目名稱後刪除該項目。項目中的每個環境都會一併刪除:其中的用户、應用程式、密鑰和設定,以及它發出的每個工作階段和權杖。項目的網址會停止回應,而且永遠不會再發給別人,因此仍然信任其中某個網址的 App,不會被別人的項目欺騙。
簽發者
每個環境都是自己的 OpenID Connect 簽發者(issuer),位於租户網域上專屬的主機:
https://<handle>.usherid.com- 正式環境的代號由你選擇:3 至 32 個小寫英文字母、數字和不連續的連字號,例如你公司的名稱。代號一經使用,就永遠不會再發給別人。
- 開發環境會取得隨機代號,例如
wise-otter-42,沒有人會把它誤認為品牌。
簽發者在環境建立時就已固定,因為它簽署的每個權杖都會在 iss 中指名它,而每個信任它的 App 都會檢查這個值。
租户網域與 Usher 自己的網域(usheridentity.com)是不同的可註冊網域,因此客户的登入頁面與 Usher Console 永遠不會是同站,而且 Cookie 僅限主機:瀏覽器只會將一個環境的 Cookie 傳送給該環境。
Lobby
Lobby 是每個環境在其簽發者上託管的登入頁面。你的 App 將用户送到這裡;它讓他們登入,再把他們送回去。
- 它一定會在「即將前往」標籤中,指出用户要前往的 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 | 重新整理權杖,讓他們保持登入。 |