client_id ページ
Misskey の OAuth 2.0 は IndieAuth 仕様に準拠しています。サーバーごとにアプリを登録する代わりに、Web ページを公開して、その URL を client_id として使います。MiAuth ではこのページは不要です。
要件
-
client_idはhttps://yoursite/yourapp/のような HTTPS の URL であること。Misskey サーバーは認可の際にこのページを取得します。 -
ページに、アプリの各
redirect_uriを<link>タグで記載すること。<link rel="redirect_uri" href="yourscheme://oauth/callback"> -
認可リクエストの
redirect_uriが、<link>タグのいずれかの URL と完全一致すること(スキーム、大文字小文字、末尾スラッシュまで一致)。両方を同じ表記で書いてください。 -
redirect_uriは HTTPS である必要はありません。Misskey が HTTPS を求めるのはclient_idだけのため、redirect_uriにアプリのカスタムスキームの URL を指定できます。その場合、Misskey はブラウザを直接アプリへ戻します(例:yourscheme://oauth/callback?code=...&state=...)。
ページの例
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
<link rel="redirect_uri" href="yourscheme://oauth/callback">
</head>
<body>
<div class="h-app">
<a href="https://yoursite/yourapp/" class="u-url p-name">Your Misskey App</a>
</div>
</body>
</html>
h-app のブロックは、Misskey にアプリの名前を伝えます。Misskey はこの名前を認可画面に表示します。
ライブラリにも同じ値を渡します。
MisskeyOAuthConfig(
host: 'misskey.io',
clientId: 'https://yoursite/yourapp/',
redirectUri: 'yourscheme://oauth/callback',
scope: 'read:account write:notes',
callbackScheme: 'yourscheme',
)
redirectUri がカスタムスキームの場合、ライブラリはそのスキームで戻るのを待ち、callbackScheme は使いません。ただし引数としては必須です。
任意: HTTPS の中継ページ
HTTPS のページを redirect_uri にし、そこからカスタムスキームへ転送する構成も使えます。Misskey の要件ではありません。この構成にする場合は、次のようにします。
<link>タグには中継ページを記載します(例:<link rel="redirect_uri" href="https://yoursite/yourapp/redirect.html">)。redirectUriには中継ページの URL を指定します。callbackSchemeには、中継ページの転送先のスキームを指定します。
<!DOCTYPE html>
<html>
<head>
<meta name="referrer" content="no-referrer">
</head>
<body>
<script>
// 存在するパラメータだけを転送する。エラー時にも `state` が付く
const source = new URLSearchParams(window.location.search);
const forwarded = new URLSearchParams();
for (const name of ['code', 'state', 'error', 'error_description', 'iss']) {
// ライブラリが重複を拒否できるよう、重複した値も残して転送する
for (const value of source.getAll(name)) forwarded.append(name, value);
}
window.location.replace(`yourscheme://oauth/callback?${forwarded}`);
</script>
</body>
</html>
- ライブラリは
errorより先にstateを照合するため、成功時とエラー時のどちらでもstateを転送してください。 - URL に認可コードが含まれるため、このページで第三者のスクリプトを読み込まないでください。
よくあるエラー
Invalid redirect_uri: リクエストのredirect_uriが、client_id ページのどの<link rel="redirect_uri">とも完全一致していません。スキーム、ドメインの大文字小文字、末尾スラッシュを確認してください。- ブラウザがアプリに戻らない:
redirect_uriのスキーム(または中継ページの転送先のスキーム)がアプリに登録されていません。プラットフォーム設定を参照してください。