Auth0 の MACHINE TO MACHINE 認証によるAPIの認可

渡辺です。

認証と認可の元で実行されるAPIを開発しています。

一般ユーザはCognitoやAuth0といった認証基盤で認証され、APIへアクセスし許可された操作を行えるといった仕組みが一般的です。 しかし、例えば、APIを実行するサービス自体がAPIであったり、CLIからAPIを実行したりするような場合、パスワード認証といった手段は現実的ではありません。 Auth0では、こういったユースケースで、 機器間認証(M2M: MACHINE TO MACHINE認証) を利用できます。

ゴール

M2M認証の設定を行えば、クライアントはAuth0へ認証リクエストを行い、アクセストークンを取得することができます。

「機器間(M2M)認証を使用する」より引用

機器間(M2M)認証を使用するより

例えば、curlでは次のようなコマンドです。

curl --request POST \
  --url https://[YOUR DOMAIN].auth0.com/oauth/token \
  --header 'content-type: application/json' \
  --data '{"client_id":"XXXXX","client_secret":"XXXXXXX","audience":"https://api.example.com/v1","grant_type":"client_credentials"}'

レスポンスにはアクセストークンが含まれます。

{
  "access_token": "eyJ0XXXXXXXXXXXXXXX",
  "token_type": "Bearer"
}

クライアントは、このアクセストークンをヘッダに追加し、対象のAPIを実行します。

curl --request POST \
  --url https://api.example.com/checkin \
  --header 'content-type: application/json' \
  --header 'Authorization:Bearer eyJ0XXXXXXXXXXXXXXX'

このアクセストークンはデコードすると、次のようなペイロードを含みます。

{
  "iss": "https://[YOUR DOMAIN].auth0.com/",
  "sub": "XXXXXXXXXXXXXXXXX@clients",
  "aud": "https://api.example.com/v1",
  "iat": 1560430406,
  "exp": 1560516806,
  "azp": "zzzzzzzzzzzz",
  "scope": "checkin checkout",
  "gty": "client-credentials"
}

ペイロードの scope に認可するAPIのメソッドが含まれ、この情報を元にAPIはレスポンスを返すことができます。

つまり、クライアントでは、クライアントIDとクライアントシークレットにより、Auth0に認証リクエストを行い、アクセストークンを取得。 アクセストークンをAPIに送り、APIで検証して認可することになります。 この仕組みを利用すれば、ログインで利用する一般ユーザと同様の仕組みで、APIの認証と認可を実装可能です。

Auth0での設定

それでは、Auth0で設定を行っていきましょう。

APIの定義

はじめに、対象のAPIを定義します。 APIsメニューからAPIリストを表示し、「Create API」をクリックしてください。

Nameには適当な名前を、IdentifierにはAPIのエンドポイントを設定します。

APIを作成したならば、Permissionタブより、APIで認可が必要な操作(Permission)を追加します。 PermissionはAPIのメソッド毎に作成しても良いですし、グループのような概念でも構いません(実装次第です)。

ここでは、 checkincheckout というふたつの Permission を追加しました。

M2M Applicationの作成

M2M Applicationを作成します。 Application毎にクライアントIDとクライアントシークレットが発行されます。 機器単位で作成するのか、権限単位で発行するのかは設計が難しいところかもしれません。

ここでは、Gate Keeperという名前でM2M Applicationを作成します。

続けて許可するAPIとScopeを設定します。 先ほど作成した、Example APIの checkin を追加しました。

作成したApplicationのクライアントIDとクライアントシークレットは、Settingタブから確認出来ます。

クライアントでアクセストークンを取得する

Quick Startタブを開くと、各種言語でのアクセストークンの取得コードが確認出来ます。

まとめ

Auth0 のM2M認証を使えば、機器やサービスなどからAPIをアクセスする仕組みが簡単に実装できますね。