はじめに
Auth0が発行するアクセストークンが無いと呼び出せないWebAPIを作成してみます。
管理画面にAPIを登録
Auth0の管理画面のAPIsのページを開き右上のCREATE API
を押します。
作成するWebAPIの情報としてName
とIdentifier
を入力します。
Name
は機能に影響しないので後から見てなにを表しているかわかりやすい名前をつけたほうが良いです。
Identifier
はテナント内で一意となる識別子であれば形式はなんでも良いですが、Auth0はURL形式を推奨しています。
Identifier
は後から変更することができないので注意してください。
Singning Alogorithm
はRS256
とHS256
の2択となっています。
RS256
だと署名が、HS256
だとHMACがトークンに付与されます。選択したアルゴリズムに合わせてWebAPIはトークンを検証します。
本記事ではRS256
で設定を行います。
入力が完了したらCREATE
を押すとAPIが登録されます。
登録したAPIのSettings
タブを開くとAPIの設定を変更できます。
この画面でこのAPI向けのアクセストークンの有効期限を変更したり、リフレッシュトークンの利用可否を設定することが可能です。
Permission設定
権限設定をやってみます。
Permissions
タブを開いてPermission
とDescription
を設定します。
後ほど出てくるWebAPIのサンプルアプリケーションで定義されているread:messages
を追加します。
WebAPIの準備
WebAPIのサンプルアプリケーションがAuth0公式で用意されているのでそちらを利用します。
Auth0-SamplesのGitHubリポジトリにはいくつかAPIのサンプルがありますが本記事ではExpressのWebAPIのサンプルアプリケーションを使用します。
管理画面でAPIを登録するときにRS256
を選択しているのでサンプルアプリケーションもそれに合わせて01-Authorization-RS256
を使用します。
中に.env.example
というファイルがあるので.env
にリネームし中身を書き換えます。
AUTH0_AUDIENCE
は先ほど管理画面で登録したAPIのIdentifier
を設定しAUTH0_DOMAIN
にはAuth0のテナントのドメインを設定します。
AUTH0_AUDIENCE={API_IDENTIFIER}
AUTH0_DOMAIN={DOMAIN}
設定が完了したらコマンドを入力してWebAPIを起動させます。
npm run start
成功すればlocalhost:3010
で起動します。
アクセストークンの取得
準備したWebAPIにはAuth0が発行する専用のアクセストークンがないと呼び出せないAPIがあります。
WebAPIと同一テナントに登録されているアプリケーションであればどれからでも専用のアクセストークンを取得できますが
本記事では簡単に試すためにAPIを登録したときに自動で作成されるTest Application
を利用します。
Machine to Machine Applications
タブを開くとAPIと接続可能なアプリケーションの一覧が表示されます。
本記事で登録したAPIの場合はexample (Test Application)
が自動で作成されたテストアプリケーションになります。
テストアプリケーションの右側のトグルボタンがAUTHORIZED
となっていることを確認し>
を押します。
PERMISSIONS
の一覧が表示されるので先ほど登録したread:messages
にチェックをいれてUPDATE
を押します。
次にTest
タブを開くとテストアプリケーションからアクセストークンを取得する方法が記載されているのでその内容を参考にCLIでアクセストークンを取得します。
アクセストークンを取得するときにaudience
パラメーターで対象のAPIのIdentifier
を指定することでそのAPI専用のアクセストークンを取得しています。
テナント名
、クライアントID
、クライアントシークレット
には適切な値を設定してください。
curl --request POST \
--url https://テナント名/oauth/token \
--header 'content-type: application/json' \
--data '{"client_id":"クライアントID","client_secret":"クライアントシークレット","audience":"https://example.com/","grant_type":"client_credentials"}'
成功すればアクセストークンが取得できます。
{
"access_token": "eyJhbG...............",
"token_type": "Bearer"
}
取得したアクセストークンはJWT形式になっています。
jwt.ioというサイトでアクセストークンをデコードして中に含まれている情報をみることができるので試してみてください。
アクセストークンの中にaud
プロパティにIdentifier
の値が入っていることとscope
プロパティにPermission
の内容が含まれていることが確認できます。
WebAPIを呼び出す
WebAPIをCLIで呼び出してみます。
WebAPIのサンプルアプリケーションにはpublic
、private
、private-scoped
の3つのAPIが定義されているのでそれぞれ試します。
最初にpublic
のAPIを呼び出してみます。
このAPIはアクセストークンがなくても呼び出し可能なのでアクセストークンを使用していません。
curl --request GET \
--url http://localhost:3010/api/public
{"message":"Hello from a public endpoint! You don't need to be authenticated to see this."}
次にprivate
のAPIを呼び出してみます。
このAPIはアクセストークンが必須なのでauthorization
ヘッダーにアクセストークンを設定します。
アクセストークン
には実際のアクセストークンを設定します。
curl --request GET \
--url http://localhost:3010/api/private \
--header 'authorization: Bearer アクセストークン'
{"message":"Hello from a private endpoint! You need to be authenticated to see this."}
アクセストークンなしで呼び出すとエラーになります。
curl --request GET \
--url http://localhost:3010/api/private
{"message":"No authorization token was found"}
最後にprivate-scoped
のAPIを呼び出します。
こちらも同様にアクセストークン
には実際のアクセストークンを設定します。
curl --request GET \
--url http://localhost:3010/api/private-scoped \
--header 'authorization: Bearer アクセストークン'
{"message":"Hello from a private endpoint! You need to be authenticated and have a scope of read:messages to see this."}
private-scoped
のAPIはアクセストークンの有無だけではなくPermissionを保持しているかまで判断しています。
試しにMachine to Machine Applications
タブで設定したread:messages
のPermissionのチェックを外してテストアプリケーションがPermissionを持っていない状態で取得したアクセストークンを使ってAPIを呼び出すと下記のエラーメッセージが返ってきます。
Insufficient scope
おわりに
アクセストークンが無いと呼び出せないWebAPIを公式のサンプルアプリケーションを使って用意してみました。
Auth0はログイン機能だけではなくAPIを守る仕組みも提供してくれます。ぜひ活用してみてください。