トークンとユーザー情報 デベロッパ

最終更新:2026年8月15日

トークンとユーザー情報

トークン交換が成功したあと、ID Token の検証、Access Token の使い方、UserInfo が返すクレームの読み方を説明します。

トークンの種類

トークン形態(ポータルアプリ)用途
id_tokenJWT、ES256 署名ユーザーが認証済みであることをクライアントに証明。pairwise sub などを含む
access_tokenJWT、ES256 署名UserInfo など保護リソースの呼び出し。JWKS で検証できる
refresh_token不透明トークン(機密クライアントのみ)Access Token の更新

ディスカバリ文書の id_token_signing_alg_values_supported には ES256 が含まれているはずです。検証用の公開鍵は次から取得します:

GET {ISSUER}/oauth2/jwks

JWKS をキャッシュし、kid で鍵を選んでください。鍵がローテーションしたら JWKS を取り直してください。

ID Token の検証(必須)

少なくとも次を確認します:

  1. 署名:ES256 + JWKS。
  2. iss:あなたの Issuer と一致(例:https://api-passport.swaymoon.com)。
  3. aud:あなたの client_id を含む。
  4. exp / iat:期限切れでないこと。時計のずれに合理的な余裕を見る。
  5. nonce(認可リクエストで送った場合):セッションに保存した値と一致。

ID Token の sub は、あなたのアプリ(チーム)向けの安定したユーザー識別です。ローカルユーザーを紐づける主キーに使ってください。

現在の実装では、email と大半のプロフィール系クレームは UserInfo が正です。ID Token に必ず emailpicture があると思わないでください。例外:locale が付与されているとき、ID Token に locale が含まれます(BCP 47、例:zh-CN / zh-TW / en / ja)。認可コールバックで優先言語を読めます。ID Token の sub を検証したあと、Access Token で UserInfo を呼び、残りのクレームを読んでください。

Pairwise sub

デベロッパチームに紐づいたクライアントでは、アカウントは pairwise の主体識別子を使います:

  • 同一の自然人ユーザーがあなたのチーム下のアプリに繰り返しサインインすると、sub同じです。
  • 同一ユーザーが別チームのアプリを認可すると、sub異なります
  • したがって、sub で別アプリや別チームのユーザーを紐づけられると仮定しないでください。メールを sub の代わりに唯一の主キーにしないでください。ユーザーは紐づけメールを変えられます。

UserInfo

GET /userinfo
Host: api-passport.swaymoon.com
Authorization: Bearer ACCESS_TOKEN

このエンドポイントは JSON のクレームを返します。sub は ID Token と同じです(pairwise)。

常に含まれる

クレーム意味
subpairwise ユーザー識別(openid がある限り)

プロフィールクレーム:項目ごとの認可 + 既定値

次のクレームは UserInfo 応答に常に現れます(フィールド形状は安定)。実データかどうかは、トークンの scope に対応細目があるかによります(「権限と同意」を参照)。

クレーム必要な scope認可済みのとき未認可のとき(既定値)
namename表示名Swaymoon ユーザー
nicknamenicknameニックネーム。未設定なら Swaymoon ユーザーSwaymoon ユーザー
picturepictureアバターの HTTPS URL。未設定なら空文字""
biographybiography自己紹介。未設定なら空文字""
gendergendermale / female / other。未設定なら空文字""
birthdatebirthdateYYYY-MM-DD。未設定なら空文字""
regionregion地域コード。未設定なら空文字""
preferred_usernamepreferred_usernameユーザー名。未設定なら空文字""
localelocaleBCP 47 タグ(zh-CN / zh-TW / en / ja""
updated_atいずれかのプロフィール細目プロフィール更新時刻(Unix 秒)0

既定値をユーザーの実プロフィールと見なさないでください。トークンの scope でどのフィールドが認可されたかを判断し、scope にない項目はプレースホルダです。

古いトークンがまとめて profile を含む場合、サーバーは上記のプロフィール細目がすべて認可済みと見なします。

picture(アバター)

picture が付与され、ユーザーがアバターを設定しているとき、UserInfo は絶対 HTTPS URL を返します(Issuer ドメイン。例:https://api-passport.swaymoon.com/media/avatars/…)。ブラウザやサーバーから追加認証なしで取得できます。未設定なら空文字です。

保存するときは次のどちらか(製品に応じて組み合わせも可):

  1. URL だけ保存picture URL をローカルのユーザー資料に書き、表示時はアカウントが提供するアドレスをそのまま使います。自前のオブジェクトストレージは不要で、実装は単純です。ユーザーが後からアバターを変えると、古い URL は使えなくなることがあります(ファイル名にランダム部分があります)。サインイン / プロフィール更新時に保存リンクを更新するか、表示前に UserInfo を再読してください。
  2. ファイルを保存:自前サーバー(または安全なクライアント)でその HTTPS URL を GET し、画像を自前ストレージに書き、ローカルには自前のリソース URL だけ残します。長期的に自社 CDN でホストしたい、オフライン / 切り抜き処理が必要な場合に向きます。合理的なキャッシュとサイズ制限を守り、高頻度で何度も取らないでください。

どちらも本番 Issuer が HTTPS であることが前提です。ローカル連携で Issuer が http://… なら、返る URL も HTTP のことがあります。公開前に本番設定で確認してください。

email

トークンに email があるときだけ返ります:

クレーム意味
emailそのユーザーへ連絡できるメール(確認済み)
email_verifiedtrue(メールを返すとき)

email が付与されていないとき、上記のメールクレームは応答に含まれません(プロフィール既定値の方針とは異なります)。

同意ページでユーザーは、メール権限を通常メールまたはプライバシーメールとして渡せます:

ユーザーの選択受け取る email実メール
通常メールアカウントに紐づいたメールそのアドレス
プライバシーメールあなたのアプリ専用の中継アドレス(…@privaterelay.swaymoon.comUserInfo や他の OAuth 経路では渡されません。中継宛のメールはアカウントが実メールへ転送します

どちらの場合も email は普通に受信できるアドレスです。通常メールとして扱ってください(登録、送信、表示)。ユーザーはプライバシーメールを選ぶ可能性があるので、日常の私用メールだと仮定せず、実アドレスを求めたり推測したりしないでください。アカウントの主キーは引き続き sub です。

認可完了にメールが必要な場合: 認可リクエストに email があり、ユーザーがチェック / 必須で付与するとき、アカウントにメールが未紐づけなら、先に紐づけと確認へ案内し、成功してから同意とコード発行を続けます。したがってトークンに email scope があるとき、UserInfo は 常に emailemail_verified を含むはずです。任意の email は外して続けることもできます(あなたが必須にしていなければ)。

取り消しとイントロスペクション

  • 取り消し:POST {ISSUER}/oauth2/revoke(RFC 7009 とサーバー実装に従ってトークンを渡します)。
  • イントロスペクション:POST {ISSUER}/oauth2/introspect(機密クライアントはトークン状態を照会できます)。

具体的なパラメータはディスカバリ文書とサーバー応答に従ってください。

アカウント作成の指針

  1. 検証済みの sub でローカルユーザーを検索または作成します。
  2. トークンの scope でプロフィールフィールドを解釈します。未認可フィールドの既定値は「利用不可」とし、業務プロフィールに書かないでください。
  3. アバター:先に「HTTPS URL だけ保存」か「ダウンロードして自前保存」かを決めてください。上記 picture を参照。
  4. 機密クライアントは client_secret を安全に保管します。非機密クライアントにシークレットはありません。ユーザーのアカウントパスワードを集めたり保存したりしないでください。
  5. Access Token の有効期間は短いので、必要に応じて更新してください。ユーザーがサインアウトするとき、製品の必要に応じて Refresh Token を取り消せます。

次のステップ:「権限と同意」を読んでください。連携中に問題があれば「例とトラブルシューティング」を参照してください。