このチュートリアルでは、Resource Owner Password Flow を使用して独自の API を呼び出す方法を説明します。このフローの仕組みや、これを使用すべき理由について詳しくは、Resource Owner Password Flowを参照してください。
前提条件
-
Auth0 にアプリケーションを登録する。
- Application Type で Regular Web Apps を選択します。
- Allowed Callback URL に
{https://yourApp/callback}を追加します。このフィールドを未設定のままにすると、エラーメッセージが返されます。 - アプリケーションの Grant Types に Password が含まれていることを確認します。手順については、Grant Types を更新する を参照してください。
- アプリケーションでリフレッシュトークンを使用できるようにするには、アプリケーションの Grant Types に Refresh Token が含まれていることを確認します。手順については、Grant Types を更新する を参照してください。リフレッシュトークンの詳細については、Refresh Tokens を参照してください。
-
Auth0 に API を登録する
- API が以前のトークンの有効期限が切れたときに新しいトークンを取得できるよう、API でリフレッシュトークンを受け取れるようにする場合は、Allow Offline Access を有効にします。
-
接続を設定する
- 接続が username とパスワードでユーザーを認証できることを確認します (たとえば、データベース接続、または AD/LDAP、ADFS、Azure Active Directory の エンタープライズ接続) 。
-
Rules を更新または無効にして、特定の接続にのみ影響するようにします。Password Owner Resource Grant のテスト中に
access_deniedエラーが発生する場合は、アクセス制御の Rule が原因である可能性があります。
手順
- テナントを設定:テナントのデフォルト接続を設定します。
- トークンを取得: 認可コードをトークンに交換します。
- APIを呼び出す: 取得したアクセストークンを使用してAPIを呼び出します。
- トークンを更新: 既存のトークンの有効期限が切れたら、リフレッシュトークンを使用して新しいトークンをリクエストします。
テナントを設定する
- Auth0 Dashboard > Tenant Settings に移動し、下にスクロールして Default Directory 設定を探します。
- 使用する接続の名前を入力します。その接続が、ユーザー名とパスワードによるユーザー認証に対応していることを確認してください。
トークンをリクエストする
POST リクエストを送信します。
トークンURLへのPOSTリクエストの例
パラメーター
| パラメーター名 | 説明 |
|---|---|
grant_type | password に設定します。 |
username | ユーザーが入力した username。 |
password | ユーザーが入力したパスワード。 |
client_id | アプリケーションのクライアントIDです。この値は Application Settings で確認できます。 |
client_assertion | アプリケーションの認証情報で署名したアサーションを含む JWT です。アプリケーションの認証方法が Private Key JWT の場合に必要です。 |
client_assertion_type | 値は urn:ietf:params:oauth:client-assertion-type:jwt-bearer です。アプリケーションの認証方法が Private Key JWT の場合に必要です。 |
client_secret | アプリケーションのクライアントシークレットです。アプリケーションの認証方法が Client Secret の場合に必要です。Application Settings でアプリケーション認証方法が Post または Basic に設定されている場合に使用します。アプリケーションの信頼性が高くない場合 (たとえば SPA など) は、このパラメーターを設定しないでください。 |
audience | トークンのオーディエンスです。これは API を指定します。この値は API’s settings tab の Identifier フィールドで確認できます。 |
scope | 認可をリクエストする スコープ を指定します。これにより、返されるクレーム (またはユーザー属性) が決まります。各値はスペースで区切る必要があります。profile や email など、ユーザーに関する 標準の OpenID Connect (OIDC) スコープ、namespaced format に準拠した カスタムクレーム、または対象 API がサポートする任意のスコープ (例: read:contacts) をリクエストできます。Refresh Token を取得するには offline_access を含めます (Application Settings で Allow Offline Access フィールドが有効になっていることを確認してください) 。 |
レスポンス
access_token、refresh_token、id_token、token_type、expires_in の各値を含むペイロードを伴う HTTP 200 レスポンスが返されます。
Resource Owner Password Flow と標準スコープ
パスワードを提供すると完全なアクセス権が与えられるため、パスワードベースのやり取りではすべてのスコープへのアクセスが許可されます。たとえば、リクエストに APIスコープ を含めない場合、すべての API スコープがアクセストークンに含まれます。同様に、リクエストに
openid スコープのみを含めた場合は、openid の標準 OpenID Connect スコープ がすべて返されます。これらのケースでは、レスポンスに scope パラメーターが含まれ、発行されたスコープの一覧が返されます。IDトークンなしでユーザー情報を取得する
ユーザー情報が必要な場合は、リクエストに
openid スコープを含めてください。API が 署名アルゴリズム として RS256 を使用している場合、アクセストークンには有効なオーディエンスとして /userinfo が含まれます。つまり、そのアクセストークンを使って /userinfo エンドポイント を呼び出し、ユーザーのクレームを取得できます。API を呼び出す
リフレッシュトークン
- オフラインアクセスを許可するように API を設定した
- authorize エンドポイントを通じて認証リクエストを開始する際に、
offline_accessスコープを含めた
grant_type=refresh_token を使用して、Authentication API の /oauth/token エンドポイントに POST リクエストを送信します。
トークンURLへのPOSTの例
パラメーター
| パラメーター名 | 説明 |
|---|---|
grant_type | refresh_token に設定します。 |
client_id | アプリケーションのクライアントIDです。この値は Application Settings で確認できます。 |
refresh_token | 使用するリフレッシュトークンです。 |
scope | (任意) 要求するスコープをスペース区切りで指定します。指定しない場合は元のスコープが使用されます。指定した場合は、元のスコープより少ない範囲を要求できます。なお、URL エンコードが必要です。 |
レスポンス
access_token、その有効期間 (秒単位の expires_in) 、付与された scope の値、および token_type を含むペイロードとともに、HTTP 200 レスポンスが返されます。
使用例
トークンをカスタマイズする
レルムのサポートを設定する
grant_typeリクエストパラメーターをhttp://auth0.com/oauth/grant-type/password-realmに設定します。realmという追加のリクエストパラメーターを送信し、ユーザーが属するレルムの名前を指定します。たとえば、employeesという名前の社内従業員向けデータベース接続を設定しており、そのユーザーがその接続に属している場合は、realmをemployeesに設定します。
レルムとしての接続
アクティブな認証をサポートする接続であれば、データベース接続、パスワードレス接続、AD/LDAP、ADFS、Azure Active Directory のエンタープライズ接続など、レルムとして設定できます。