0.はじめに
以前、こんな記事を書きましたが、Auth0でClient自体をAPIで登録する方法について追加で調べました。
1. management APIの Domain, Client ID, Client Secretを取得する
Auth0のダッシュボードの>Applicationから任意のアプリケーションを選択しSettings
のBasic Information
からDomain
, Client ID
, Client Secret
を取得します
2. apiからclientを登録する
今回はPythonでコードを書いてみました。
clientを登録して利用できるまでのステップとしては以下になります。
- Domain, Client ID, Client Secretからアクセストークンを取得する
- アクセストークンを使ってClient作成APIにリクエストする
- 登録したClientにGrantを登録するAPIにリクエストする
Domain, Client ID, Client Secretからアクセストークンを取得する
事前に取得した Domain, Client ID, Client Secretからアクセストークンを取得します。
以下はサンプルコードで環境変数にDomain, Client ID, Client Secretが登録されているものとします。
import os
from dotenv import load_dotenv
import requests
class FetchManagementApiTokenService:
def __init__(self, url, client_id, client_secret):
self.url = url
self.client_id = client_id
self.client_secret = client_secret
def fetch_token(self):
fetch_token_url = f'{self.url}/oauth/token'
headers = {
'content-type': 'application/json'
}
request_body = {
'client_id': self.client_id,
'client_secret': self.client_secret,
'audience': f'{self.url}/api/v2/',
'grant_type': 'client_credentials'
}
response = requests.post(fetch_token_url, headers=headers, json=request_body)
response.raise_for_status()
return response.json()['access_token']
load_dotenv()
url = os.environ['AUTH0_MANAGEMENT_URL']
client_id = os.environ['AUTH0_MANAGEMENT_CLIENT_ID']
client_secret = os.environ['AUTH0_MANAGEMENT_CLIENT_SECRET']
service = FetchManagementApiTokenService(url=url, client_id=client_id, client_secret=client_secret)
token = service.fetch_token()
print(token)
アクセストークンを使ってClient作成APIにリクエストする
次にこのアクセストークンからClient作成APIにリクエストします。
class CreateClientService:
def __init__(self, url, token):
self.url = url
self.token = token
def create_client(self):
create_client_url = f'{self.url}/api/v2/clients'
headers = {
'content-type': 'application/json',
'authorization': f'Bearer {self.token}'
}
# 登録するClientの情報。各パラメータは以下を参照
# https://auth0.com/docs/api/management/v2/clients/post-clients
body = {
'name': 'my-new-client',
'app_type': 'non_interactive',
'jwt_configuration': {
'alg': 'RS256',
'lifetime_in_seconds': 36000
}
}
response = requests.post(create_client_url, headers=headers, json=body)
print(response.json())
response.raise_for_status()
return response.json()
# tokenは前のセクションで取得したアクセストークンを代入してください。
service = CreateClientService(url, token)
service.create_client()
このJSONの中にclient_id, Client_secretが含まれるためそれぞれ取得します。
またダッシューボードのApplications
を確認すると指定したClientが登録されていることが確認できます
登録したClientにGrantを登録するAPIにリクエストする
次にこのアクセストークンと登録したClient IDからClient-Grants作成APIにリクエストします。
このAPIを使用することによって登録したClientを使って操作できるリソースを選択することができます。
class CreateClientGrantsService:
def __init__(self, url, client_id, token):
self.url = url
self.client_id = client_id
self.token = token
def create_client_grants(self):
update_client_grants_url = f'{self.url}/api/v2/client-grants'
headers = {
'content-type': 'application/json',
'authorization': f'Bearer {self.token}'
}
# このClientで取得したいリソースの内容をscopeに記載します。
# 今回はユーザの読み取りをつけます。
body = {
'client_id': self.client_id,
'audience': f'{self.url}/api/v2/',
'scope': ['read:users']
}
print(body)
response = requests.post(update_client_grants_url, headers=headers, json=body)
print(response.json())
response.raise_for_status()
return response.json()
# client_idは前回のコードのjsonから取得してください
service = CreateClientGrantsService(url, client_id, token)
実行すると以下のようなレスポンスを取得でき、scopeにもユーザの読み取りが設定されています。
Auth0で該当のClientのPermissionsを確認するとread:users
に✅がついています。
ClientをAPIで登録し、使用できるようにするまでの手順は以上です。
あとは以前書いたこの記事に書いてある方法で、登録したClientからアクセストークンの取得とリソースの取得が行えるようにないます。
3.おわりに
Auth0便利🎉
機会があったら別の機能も使ってみます。