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て感じだ。

一覧へ戻る