
Auth0を使う
かなり沼った
Auth0で認証を行い、cf workersでリソースサーバーを作成していたのだが、かなり沼ったので、備忘録程度に書いておこうと思う。
Auth0はIdP。AWS Cognitoとかに当たる。
トークンがおかしい
クライアントアプリはflutterで作っていた。この際最初audienceクレームの事が抜け落ちていたのが始まりだった。
audienceクレームは設定されていなくても、Auth0自体の認証は通ってしまう。そしてちゃんとトークンも返ってくる…
JWT何だけど、JWEじゃね
eyJh....
みたいなトークンが返ってきており、当然普通の(暗号化がされていな)JWTだと思ってサーバーサイドは実装していたのだが、いざ接続してみるとエラーで落ちる。
よくよく見てみると、JWE(暗号化されたトークン)になっていた。
共通鍵、どこですか?
JWEはヘッダーは見れるので、見てみると
{ "alg": "dir", "enc": "A256GCM", "iss": "https://....us.auth0.com/" }
この時はなるほど、よく変わらないけどAuth0は共通鍵を用いた方法でリソースサーバーは検証するんだと思っていた。
で、A256GCMは256bitの共通鍵が必要なのだが、ダッシュボードから見れるclient secretは512bitである。?って感じで、base64でエンコードされてるんか?と思ったがそんなことはなく、エラーを吐きまくった。
判明
このJWE,不透明なトークンってやつらしいとわかる。
https://community.auth0.com/t/decode-jwes-access-token/107508/3
まあ要するに、普通は使わんやつだ
audienceを指定してみる
final credentials = await auth0.webAuthentication().login(
audience: 'https://exmaple.com',
);
OTHER: An unexpected error occurred. CAUSE: Service not found:
どうやらこのエラーはaudienceのクレームに設定した値が、Auth0側で設定されてない時に起きるらしい。これは最初からどこだよと言っていたので、そりゃそうだって感じだ。
APIs紛らわしすぎる
APIsってやつは、直接ユーザーのBANとか作成をした時に使うもんだと思っていたが、そんなこと(not only but also)はなく、audienceの設定にも作成が必要らしい。
identifierに設定した値が、これに該当するらしいので、設定。 またAPIsとApplicationsって完全に独立したものだと思っていたが、そんなことは無く、特に設定しなくてもNative Appで作成したやつのクライアントIDを設定してもいけた。
Reクエスト
もう一回リクエストを投げてみると、普通の(暗号化されていない)JWTが返ってくるようになった。OKて感じだ。