はじめに
Auth0では管理画面のAPIs
メニューに登録した独自のWebAPI向けのアクセストークンを取得できます。
Auth0が発行するWebAPI向けのアクセストークンはJWT形式となっていて、WebAPIからAuth0に問い合わせなくてもユーザーIDなどの情報をアクセストークンから取得できるようになっています。
本記事ではM2MではなくAuth0の認証機能を組み込んだアプリケーションを利用するユーザー用のWebAPI向けアクセストークンを取得する方法を紹介します。
事前準備
アプリケーションとAPIの関連付け
Auth0の管理画面でアプリケーションとAPIの登録と関連付けをします。
本記事では事前に用意したMy App
というRegular Web ApplicationとSample API
という名前のAPIを例として使用します。
Sample API
の設定画面を開いてMy App
のトグルスイッチをON(AUTHORIZED)にします。
すると、権限(Permissions)を設定する画面が表示されます。
しかしこの画面で設定する権限はアプリケーション自体が持つ権限のことを指していてユーザーの権限とは異なるものになります。
ユーザー用のアクセストークンを取得する時には設定不要です。
アプリケーションとAPIの関連付けが不要なケース
関連付けを行う画面の上部にも書いてありますが、アプリケーションのタイプがSPAやNativeの場合はここで明示的に関連付けを行わなくてもAPI向けのアクセストークンを取得することができます。
SPAやNativeなどのPublicクライアントに分類されるアプリケーションはログインフローの中でクライアント認証が行われないのでAPIとの紐付けを保証することができないため設定が不要になっていると思われます。
JWT形式のアクセストークン取得
ログイン時のパラメーター
ログイン時のリクエストにaudience
パラメーターとしてAPIのIdentifier
を設定するとログイン処理の完了時にJWT形式のアクセストークンが取得できます。
Auth0のAPI仕様に記載されていた内容にaudienceの値を設定したものを例として以下に記載します。
Auth0のSDKを使う場合でも同じようにログイン処理のパラメーターにaudience
を追加してください。
GET https://YOUR_DOMAIN/authorize?
audience=https://example.com/&
scope=SCOPE&
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=https://YOUR_APP/callback&
state=STATE
本記事では扱いませんが、もしもログインするユーザーにRoleやPermissionなどを付与していれば、このリクエスト時のscope
パラメーターにその値を含めることでアクセストークンに権限の情報を含めることができます。
ユーザーのRoleやPermissionの設定については機会があればまた別記事で紹介したいと思います。
アクセストークンのペイロード
ここまでの設定がうまくいけばJWT形式のアクセストークンが取得できます。
取得したアクセストークンのペイロード部分をデコードすると以下のような情報を含んだjsonが取得できます。
{
"iss": "https://YOUR_DOMAIN/",
"sub": "auth0|5f14f3b8afdb6c0.........",
"aud": [
"https://example.com",
"https://YOUR_DOMAIN/userinfo"
],
"iat": 1595848832,
"exp": 1595935232,
"azp": "IuEp7tQh9GQ1zh.........",
"scope": "openid"
}
このアクセストークンを受け取るWebAPI側ではJWTの署名やiss
の値を検証して正統なユーザーからのアクセスかを判断します。また、audience
にAPIのIdentifier
の値が設定されてるかを検証することで、自分自身向けに発行されたアクセストークンかを判断することができます。
sub
がユーザーIDを表しているため、この値をキーとしてWebAPI側でユーザーのデータを保存しておけば、アクセストークンに含まれる情報だけでユーザーのデータの出し入れができるようになります。
おわりに
アプリケーションからログインユーザー用の独自WebAPI向けアクセストークンを取得する方法を紹介しました。
要件によってはJWT形式のアクセストークンのほうが扱いやすいこともあると思うので試してみてください。