3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Auth0 management APIでClientを登録する

Last updated at Posted at 2024-11-02

0.はじめに

以前、こんな記事を書きましたが、Auth0でClient自体をAPIで登録する方法について追加で調べました。

1. management APIの Domain, Client ID, Client Secretを取得する

Auth0のダッシュボードの>Applicationから任意のアプリケーションを選択しSettingsBasic InformationからDomain, Client ID, Client Secretを取得します

image.png

image.png

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)

実行してみるとjwt形式のアクセストークンが取得できます。
image.png

アクセストークンを使って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()

実行してみると以下のレスポンスが得られます
image.png

このJSONの中にclient_id, Client_secretが含まれるためそれぞれ取得します。
image.png

またダッシューボードのApplicationsを確認すると指定したClientが登録されていることが確認できます
image.png

登録した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にもユーザの読み取りが設定されています。
image.png

Auth0で該当のClientのPermissionsを確認するとread:usersに✅がついています。
image.png

ClientをAPIで登録し、使用できるようにするまでの手順は以上です。
あとは以前書いたこの記事に書いてある方法で、登録したClientからアクセストークンの取得とリソースの取得が行えるようにないます。

3.おわりに

Auth0便利🎉
機会があったら別の機能も使ってみます。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?