権限と同意 デベロッパ
最終更新:2026年8月16日
権限と同意
ユーザーがアカウントの同意ページで見る権限は、デベロッパポータルで設定した必須 / 任意の scope、必須権限の理由とプライバシーポリシー、および認可リクエストで実際に申請した scope によります(サーバーはポータル登録をマージします。後述の「古いクライアントの互換」を参照)。
2026-08-11 プラットフォーム更新:権限は編集可能、必須権限には理由とプライバシーポリシーが必要、サインインのたびに明示確認が必要です。同ディレクトリ「更新」の「2026-08-11 権限と同意のプラットフォーム更新」を参照してください。
互換の案内
- すでに本番の古いクライアントは、今回のプラットフォーム更新のためにコード変更や再リリースは不要です。 ポータルでの権限変更と、サインインのたびに認可確認ページへ入る処理は、アカウント側が行います。
- 新規連携や新規開発のクライアントは、この文書と同ディレクトリの最新ガイドに従ってください(ポータル登録どおりに
scopeを申請し、必須権限の理由とプライバシーポリシーのリンクを用意し、「毎回認可確認ページが出る」前提でサインイン UX を設計する。黙って認可ページをスキップすることに依存しない)。
開発の原則
単一の profile で個人情報をまとめて取ることはできません。基本プロフィールはフィールド単位の scope に分かれ、ユーザーは同意ページで任意項目を個別にチェックまたは拒否できます。
- 認可リクエストがまだ歴史的な
scope=openid profile …なら、サーバーは同意ページを出す前にprofileを次の細目へ展開します。 - トークンの
scopeは、ユーザーが最終的にチェックした細目(およびopenid/emailなど)を反映し、まとめたprofileには依存しません。 - UserInfo のプロフィール系クレームは安定したフィールド集合です。認可済みは実値(未記入なら空文字など)。未認可は既定のプレースホルダで、実データは漏らしません。「トークンとユーザー情報」を参照。
対応する scope
scope | 同意ページの文言(要約) | 対応する UserInfo クレーム |
|---|---|---|
openid | 単独では出さない。常に必須 | sub |
email | あなたのメールアドレス | email、email_verified |
name | あなたの表示名 | name |
nickname | あなたのニックネーム | nickname |
picture | あなたのアバター | picture |
biography | あなたの自己紹介 | biography |
gender | あなたの性別 | gender |
birthdate | あなたの誕生日 | birthdate |
region | あなたの国または地域 | region |
preferred_username | あなたのユーザー名 | preferred_username |
locale | あなたの優先言語 | locale |
歴史的な別名(「一括」権限として頼らないでください):
| 別名 | 動作 |
|---|---|
profile | 受信時に上表のプロフィール細目すべてへ展開。同意ページは項目ごとに表示 |
name(旧意味) | トークンに旧 name だけがあり他の細目がない場合、name + nickname として互換 |
デベロッパポータルの規則:
| 権限 | 必須にできるか | 説明 |
|---|---|---|
openid | 常に必須 | 外せない |
email | できる(必須 / 任意 / 申請しない) | 必須にするときはユーザーに見える理由とプライバシーポリシーのリンクが必要。メール未紐づけのユーザーは先に紐づけないと認可を完了できない |
基本プロフィール細目(name、preferred_username など) | できる(必須 / 任意 / 申請しない) | 必須にするときは同様に理由とプライバシーポリシーのリンクが必要。任意のときは同意ページで拒否できる |
製品で本当に使う項目だけを選んでください。プロフィール権限を「全部必須」にしないでください。権限を強制するときは、理由で用途を正直に書いてください(例:認可先でユーザー名として保存する必要がある)。
デベロッパになるには:アカウントに通知用メールが紐づいている必要があります。そうでないとデベロッパポータルにサインインできず、クライアント登録 API も呼べません。
同意ページの動作
- サインイン後、ユーザーは毎回同意 / 確認ページ(
passport.swaymoon.com)へ入ります。「以前に同じ権限を認可済み」でも黙ってスキップしません。 - アプリ名とアイコン(あれば)を表示します。プライバシーポリシーのリンクがあれば入口があります。ジャンプ前に「このドメインは Swaymoon の管理下にありません…」と出ます。必須権限を申請するときはプライバシーポリシーのリンクが必須です。
- 権限が変わっていない(そのユーザーの既存同意と比べて):「サインインを確認」と、すでに認可した項目の要約。ユーザーが確認して続行します。
- 権限の増減がある:タイトルは「権限が変更されました」。区画は新しい必須 / 新しい任意(新しい必須の横にデベロッパが書いた理由)、もう申請しない、引き続き認可。ユーザーは新しい任意を選び、確認して続行します。確認後、「もう申請しない」権限は同意記録に残りません。
- 初回認可:必須と任意の区画。必須の横に理由。
- 必須権限:チェック済みで外せない。注記は「必須」。
- 任意権限:既定でチェック。ユーザーは項目ごとに外せる。注記は「任意」。
- 今回
emailを付与するのに、アカウントにメールが未紐づけ:先にメールの紐づけと確認を終えないと、認可とコード発行を続けられません(必須emailはすぐ紐づけページへ。任意ならメールのチェックを外して続行も可)。 - 今回の申請に
emailがあり、アカウントに通知用メールが紐づいているときだけ、メール権限の横にドロップダウンが出ます(既定はプライバシーメール、実メールも選べます)。ファーストパーティアプリにはこの選択肢はありません。 - 「続ける」では、最終的にチェックした任意
scopeとすべての必須scopeだけを付与します(「もう申請しない」は含みません)。 - 「キャンセル」では認可は完了しません。
認可リクエストの
prompt=consentはまだ送れますが、確認ページを強制する必要条件ではなくなりました。本番で「毎回確認」のためにこのパラメータに頼る必要はありません。
古いクライアントの互換
アプリのサインイン時、アドレスに今回申請する権限が付きます(例:scope=openid email)。すでに公開済みのアプリでは、この文字列をすぐ変えられないことがあります。
あとからポータルで権限を必須にしたり、任意を足したりすると、アカウントはサーバー側で自動補完します。古いアプリはすぐコードを変えなくて構いません:
- 必須:ポータルに登録した必須はすべて今回の認可に入ります(アプリのアドレスに書いてなくても)。
- 新しい任意:ユーザーがサインイン済みで、まだその項目を認可していないとき、確認ページに出してチェックできます。すでに認可済みのものは「新規」扱いしません。
例:ポータルが必須「ユーザー名」、任意「アバター」を追加。古いアプリはまだ openid email だけを要求 → ユーザーは「ユーザー名」(必須)と、未認可なら「アバター」(任意)を見ます。
より詳しい説明と対照表は、同ディレクトリ「更新」の「2026-08-11 権限と同意のプラットフォーム更新」です。
新規クライアントは、認可リクエストに必要な scope を明示し、ポータル登録と揃えることを推奨します。
データ削除コールバック
アプリの登録または編集時に データ削除コールバック URL を設定できます(規則と登録入口は同ディレクトリ「登録と設定」の「データ削除コールバック URL」)。ユーザーがプライバシーセンターで「取り消しとデータ削除のリクエスト」を選ぶと、アカウントは次を行います:
- そのアプリへの認可を取り消す;
- アプリ担当者のアカウント紐づけメールへ説明メールを送る(コールバックの成否も記載);
- コールバック URL が設定されていれば、アカウントのサーバーがそのアドレスへ JSON を
POSTします(type=swaymoon.passport.data_deletion_request)。ヘッダはX-Swaymoon-Signature: sha256=<hmac>とX-Swaymoon-Request-Id。署名は生のリクエスト本文バイトに対する HMAC-SHA256 です(先に JSON をパースして再シリアライズしてから検証しないでください)。
署名鍵(平文)
| クライアント種類 | 検証鍵 |
|---|---|
| 機密(confidential) | 作成時またはローテーション時にポータルが一度だけ表示する client_secret の平文 |
| 非機密(public) / JWT アサーション | 削除コールバックを登録した場合、作成またはローテーションで webhookSecret が出ます(一度きり)。その値で検証 |
その平文を安全に保管してください。アカウント側は同じ平文を webhook 署名鍵として保存します。DB 内の OAuth クライアント認証用 client_secret は、あとから bcrypt など不可逆ハッシュになることがあります。ハッシュや {bcrypt} 付きの保存値で HMAC をしないでください。鍵をローテーションしたら、新しく渡された平文で検証してください。
コールバック URL は HTTPS のみで、ホストは 127.0.0.1 / localhost にできません。ログイン Redirect は loopback のまま使えます(ブラウザ遷移)。削除コールバックはサーバーからの送信なので、ローカル連携では HTTPS トンネルを使ってください。削除を押すときは受信端が稼働している必要があります。
subject(およびあなたが保存したユーザー識別)に従って、ローカルデータを速やかに削除してください。実行できる連携は「Python の最小実行例」の機密クライアント節「データ削除コールバックのデモ」です。
したがって、authorize に並べた任意 scope が、トークンの scope にすべて入るとは限りません。トークン交換後は応答の scope を読み、それに従って UserInfo を解釈してください(未認可フィールドは既定値であり、実データではありません)。
リクエストと設定の関係
- 認可リクエストの
scopeは、クライアントに登録済みの権限範囲の部分集合であるべきです(登録時にprofileがあれば、サーバーは対応細目が登録済みと見なします)。サーバーはさらに上記「古いクライアントの互換」どおり、ポータルの必須と新しい任意をマージします。 - 認可リクエストには
openidが必須です。 - 細目を直接申請することを推奨します。例:
scope=openid name picture。当分はprofileを送り続けてもよく、サーバーが展開します。 - ユーザーが同意すると同意台帳に記録されます。アカウントの「プライバシー」ページで見られます。ユーザーガイド「認可済みアプリ」を参照。
製品側とメール
- メールが不要なら
emailを申請しないでください。 - 登録 / アカウント作成にメールが必要なら
emailを申請すれば足ります。未紐づけのユーザーは認可フローで紐づけを終え、成功後 UserInfo は使えるemailを返します。 - ユーザーはプライバシーメールを選ぶことがあります。あなたが受け取るのは送受信できるアドレス 1 件だけで、実メールは渡りません。通常メールとして扱ってください。
- アカウントの主キーは
sub、メールは連絡先またはローカルアカウント名に使います。
権限を変える
scope を増減するには:
- デベロッパポータルで識別子を開き、対象アプリを編集し、ウィザードの「機能」で任意 / 必須権限を調整して保存します(権限変更のためにクライアントを作り直す必要はありません。クライアント種類は依然として相互変更不可です)。
- 権限を必須にするとき:その権限についてユーザーに見える理由を書き、プライバシーポリシーのリンクが設定済みであることを確認します。
- ユーザーが同じアプリに次回サインインすると認可ページへ入ります。権限の増減があれば、新規 / もう申請しない / 引き続き の区画を見て、新しい任意を選びます。権限が変わっていなければ、サインインの確認だけで足ります。
すでに本番の古いクライアントは、この能力に合わせるためのコード変更は不要です。 ポータルで保存したあと、サーバーが scope をマージし、認可確認ページを必ず出します。新規クライアントは最新ドキュメントに従ってください。
識別子を削除したあと、またはユーザーが同意を取り消したあと、古いトークンでユーザーデータへアクセスし続けないでください。