基本概念
Usherのほぼすべては、いくつかの考え方で説明できます。どこに何があるのか、誰がトークンを発行するのか、ユーザーはどこでサインインするのか、そして各トークンはどれくらい有効なのか、です。
ワークスペース、プロジェクト、環境
- ワークスペースは、Usher Consoleにおけるあなたのチームや会社です。メンバーと監査ログは、ワークスペースに属します。
- プロジェクトは、ひとつの製品です。たとえばWebアプリや、パートナーポータルです。ひとつのワークスペースに、いくつものプロジェクトを置けます。
- 環境は、プロジェクトを実際に動かすひとつのコピーで、通常は開発環境と本番環境です。ユーザー、アプリケーション、鍵、設定は、環境の中にあります。
ワークスペース · Acme Ltd
プロジェクト · Web
- development · wise-otter-42
- production · acme
プロジェクト · パートナーポータル
- development · calm-heron-17
- production · acme-partners
環境どうしは、重要なものを何も共有しません。それぞれが専用のPostgresスキーマ、専用の署名鍵、そして専用のデータキーで封印された専用のシークレットを持っています。開発環境で新規登録したユーザーは本番環境には存在せず、一方の環境のトークンを、もう一方の環境の鍵で検証できることもありません。
ワークスペースの管理者は、プロジェクトの「概要」の最後で、プロジェクト名を入力したうえで、そのプロジェクトを削除できます。プロジェクト内のすべての環境が一度に削除されます。ユーザー、アプリケーション、鍵、設定、そしてその環境が発行したすべてのセッションとトークンです。プロジェクトのアドレスは応答しなくなり、再び割り当てられることもありません。そのため、まだそのアドレスを信頼しているアプリが、他人のプロジェクトにだまされることはありません。
発行者
各環境は独立したOpenID Connectの発行者(issuer)で、テナントドメイン上に専用のホストを持ちます。
https://<handle>.usherid.com- 本番環境には、自分で選んだハンドルが付きます。英小文字、数字、連続しないハイフンからなる3〜32文字で、たとえば会社名などです。一度使われたハンドルが再び割り当てられることはありません。
- 開発環境には、
wise-otter-42のようなランダムなハンドルが付きます。ブランドと間違えられることはありません。
発行者は、環境の作成時に固定されます。その環境が署名するすべてのトークンはissでその発行者を名乗り、その環境を信頼するすべてのアプリがその値を確認するからです。
テナントドメインは、Usher自身のドメイン(usheridentity.com)とは異なる登録可能ドメインです。そのため、顧客のサインインページがUsher Consoleと同一サイトになることはありません。また、Cookieはホスト限定なので、ブラウザーはある環境のCookieをその環境だけに送ります。
Lobby
Lobbyは、各環境が発行者のアドレスでホストするサインインページです。アプリがユーザーをそこへ送ると、Lobbyがサインインを済ませ、ユーザーをアプリへ送り返します。
- 行き先のアプリ名を、「〇〇に進みます」という表示で必ず示します。
- 環境で許可された方法だけを提示します。パスキー、メールで届くコード、マジックリンク、ソーシャルアカウント(Google、GitHub、Microsoft、Apple)、パスワードです。
- 2段階認証を必須にできます。2段階目には、認証アプリ(バックアップコード付き)かパスキーを使います。
- 誰でも利用できるようにするか、アドレスやドメインのゲストリストで限定するかを選べます。
どの製品から来たユーザーにも、同じ見た目で表示されます。これは意図的なものです。ユーザーは本物のLobbyの見た目を覚え、そうでないページに気づけるようになります。
Usherアカウント
ほとんどの環境は、専用のユーザーを持っています。Usherアカウントはそれとは異なり、「Usherで続ける」を提供するすべてのアプリに、ひとつのアカウントでサインインできるものです。ユーザーは自分のアカウントをaccount.usheridentity.comで管理します。
トークンと有効期間
| トークン | デフォルト | 設定できる範囲 | 用途 |
|---|---|---|---|
| 認可コード | 5分 | 固定 | トークンとの交換に一度だけ使います。一回限りです。 |
| IDトークン | 10分 | 1〜60分 | 誰がサインインしたかをアプリに伝えます。APIの呼び出しには使いません。 |
| アクセストークン | 10分 | 1〜60分 | APIに送られ、APIがそれを検証します。 |
| リフレッシュトークン | 30日 | 1〜90日 | 新しいアクセストークンを取得します。使うたびにローテーションされます。offline_accessが必要です。 |
| マシン用アクセストークン | 15分 | 1〜60分 | client_credentials用。背後に人がいないサーバーのためのものです。 |
| メールで届くコード、マジックリンク | 10分 | 固定 | 1回のサインインに使います。コードは3回まで試せます。 |
Lobbyのセッションにも有効期間があります。使われないまま7日(1〜30日)が経つと終了し、使われていても合計30日(1〜90日)で終了します。メールアドレスなどの重要な情報を変更するには、10分以内にサインインしている必要があります。
署名鍵
トークンは、デフォルトでRS256で署名されます。代わりにES256やEdDSAを使うように環境を設定することもできます。公開鍵は環境のjwks_uriで公開されるため、ライブラリがそれを取得し、鍵がローテーションされたときには新しい鍵を取り込みます。
スコープ
| スコープ | アプリが受け取るもの |
|---|---|
openid | 必須。ユーザーのsubを含むIDトークン。 |
profile | 名前と写真。 |
email | メールアドレスと、それが確認済みかどうか。 |
offline_access | サインイン状態を保つためのリフレッシュトークン。 |