【Auth0】アプリケーションからWeb API向けのアクセストークン(JWT形式)を取得する


はじめに

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形式のアクセストークンのほうが扱いやすいこともあると思うので試してみてください。