Auth0でAPIからトークンを発行する方法を調査していて、ちょっとだけ手間だったのでその内容をメモしておきます。
背景
開発中のプロダクトで認証はAuth0を使用しているのですが、今ではフロントエンドのNuxt.jsで動いているAuth module上でWebからの認証オンリーだったのですが、バッチ処理の用途で、プログラム経由でアクセストークン(JWT)を取得する必要が発生しました。
そこでAPI経由でアクセストークン取得の方法を調べました。
調査内容
リファレンスを見ると、この辺りを使えば行けるようです。
POST /oauth/token
https://auth0.com/docs/api/authentication?http#resource-owner-password
- リソースオーナーのID/Passwordでトークン取得可能
- client_secretは不要(Application Settingがらみ以外)
実施内容
上記のリファレンスを元に、以下のクエリを実行しました。
curl -XPOST -H "content-type: application/json" https://#{auth-domain}.auth0.com/oauth/token -d '{"grant_type": "password", "client_id": "xxxxxx", "username": "test@example.com", "password": "hogehoge"}'
すると以下のエラーが帰ってきました。
{"error":"server_error","error_description":"Authorization server not configured with default connection."}
ちょっとこの内容だとよくわからなかったのですが、Webで調べると以下の記事が見つかりました。
https://community.auth0.com/t/how-to-authorize-user-with-email-password-from-server-code/7239
どうやら、 Default Directory
なるものの設定がいるようです。
あまりよくわかっていないですが、これは認証の際にどのデータソースを使用するか、というような項目ように見えます。
で、この値を何に設定するのかすぐにわからなかったのですが、 Connection -> Database 以下の データベース名を入力すれば大丈夫でした。
(デフォルトだと Username-Password-Authentication
)
こちらに設定後再度 /oauth/token APIデトークン発行を叩くと、無事トークンを発行できました。
その後そのトークンでAPIアクセスしましたが、今度はJWTのissuer (iss)が違うと言ってエラーになりました。これはAuth0でカスタムドメインを使用していたのが原因でした。トークン検証する側のカスタムドメインのAUTH0_DOMAINを使用していて、トークン生成はデフォルトドメインに対してアクセスしていたのがよくない原因でした。 両方ともカスタムドメインにアクセスし、無事トークン発行できました。
所感
前の少し思ったんですが、Auth0はすごい便利で、認証の手間を限りなくゼロにするという思想はすごく良いと思うのですが、 Default DirectoryやDefault Audience の設定などを要求されると、結局は認証の仕組みを理解しないとつまづくなと思いました。 何も理解せずに使えるサービスはないと思いますが、Auth0の利用者に要求される知識水準がどのあたりなのか、気になりました。 (そして私は、その要求水準を満たしていない..)