メインコンテンツへスキップ
このチュートリアルでは、リソース所有者のパスワードフローを使用して独自のAPIを呼び出します。フローの仕組みやメリットについては、「リソース所有者のパスワードフロー」を参照してください。
リソース所有者のパスワード(ROP)フローには、ユーザーのパスワードを処理するアプリケーションが関与するため、サードパーティクライアントで使用してはなりません。
Auth0は、Authentication APIを使用して、アプリがリソース所有者のパスワードフロー( Password Grant、またはROPGと呼ばれることもある)を簡単に実装できるようにします。APIを直接呼び出す方法については、このまま続けてお読みください。

前提条件

このチュートリアルを始める前に:
  • Auth0にアプリケーションを登録します
    • [Regular Web Apps(通常のWebアプリ)][Application Type(アプリケーションタイプ)] を選択します。
    • {https://yourApp/callback}[Allowed Callback(許可されているコールバック)]URL を追加します。このフィールドを未定義にすることはできません。未定義にすると、エラーメッセージが返されます。
    • アプリケーションの [Grant Types(付与タイプ)][Password(パスワード)] が含まれていることを確認します。詳細については、「付与タイプを更新する」をお読みください。
    • アプリケーションでリフレッシュトークンを使用できるようにするには、アプリケーションの [Grant Types(付与タイプ)][Refresh Token(リフレッシュトークン)] が含まれていることを確認してください。詳細については、「付与タイプを更新する」をお読みください。リフレッシュトークンの詳細については、「リフレッシュトークン」をお読みください。
  • APIをAuth0に登録する
    • APIがリフレッシュトークンを受信して、以前のトークンの有効期限が切れたときに新しいトークンを取得できるようにする場合は、[Allow Offline Access(オフラインアクセスの許可)] を有効にします。
  • Set up a connection(接続のセットアップ)
  • 特定の接続にのみ影響を与えるように、ルールを更新または無効化します。リソース所有者のパスワー付与をテストしている際にaccess_deniedエラーが発生した場合、アクセス制御ルールが原因である可能性があります。

ステップ

  1. テナントを構成する:テナントのデフォルト接続を設定します。
  2. トークンを要求する: 認可コードをトークンと交換します。
  3. APIを呼び出す: 取得したアクセストークンを使ってAPIを呼び出します。
  4. リフレッシュトークン: 既存のトークンが期限切れになったら、リフレッシュトークンを使用して新しいトークンを要求します。
任意:サンプルユースケースを参考にしてください 任意:レルムの対応を構成する 任意:MFAの構成 任意:攻撃防御の設定

テナントを構成する

リソース所有者のパスワードフローは、ユーザー名とパスワードでユーザーを認証できる接続に依存しているため、テナントのデフォルト接続を設定する必要があります。
  1. [Auth0 Dashboard]>[Tenant Settings(テナント設定)]に移動し、下にスクロールして [Default Directory(デフォルトディレクトリ)] 設定を見つけます。
  2. 使用する接続の名前を入力します。ユーザー名とパスワードによるユーザー認証が可能であることを確認します。

トークンを要求する

APIを呼び出すには、まずユーザーの資格情報を取得しなければなりません。これは、通常、インタラクティブな形式で行います。アプリケーションは、受け取った資格情報をトークンと交換しなければなりません。これを行うには、トークンURLPOSTする必要があります。

トークンURLへのPOSTの例

curl --request POST \
  --url 'https://{yourDomain}/oauth/token' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=password \
  --data 'username={username}' \
  --data 'password={password}' \
  --data 'audience={yourApiIdentifier}' \
  --data scope=read:sample \
  --data 'client_id={yourClientId}' \
  --data 'client_secret={yourClientSecret}'
パラメーター
パラメーター説明
grant_typeこれをpasswordに設定します。
usernameユーザーが入力したユーザー名です。
passwordユーザーが入力したパスワードです。
client_idアプリケーションのクライアントIDです。この値は[Application Settings(アプリケーションの設定)]にあります。
client_assertionアプリケーション資格情報のある署名付きアサーションを含んだJWTです。アプリケーションの認証方法が秘密鍵JWTである場合は必須です。
client_assertion_type値はurn:ietf:params:oauth:client-assertion-type:jwt-bearerです。アプリケーションの認証方法が秘密鍵JWTである場合は必須です。
client_secretアプリケーションのクライアントシークレットです。アプリケーションの認証方法がクライアントシークレットである場合は必須です。[Application Settings(アプリケーションの設定)]PostまたはBasicです。アプリケーションの信頼性が高くない場合(SPAなど)には、このパラメーターを設定してはいけません。
audienceトークンのオーディエンス、つまりはAPIです。これはAPIの[Settings(設定)]タブ[Identifier(識別子)] フィールドにあります。
scope認可を要求したいスコープを指定します。これによって、受け取りたいクレーム(またはユーザー属性)が決定されます。スペース区切りでリストする必要があります。ユーザーについて任意の標準OpenID Connect(OIDC)スコープを要求できます。たとえば、profileemail名前空間形式に準拠したカスタムクレーム、呼び出すAPIが対応しているスコープ(read:contactsなど)を要求できます。を取得するには、offline_accessを含めます([Application Settings(アプリケーションの設定)])で__[Allow Offline Access(オフラインアクセスを許可する)]__フィールドが有効になっていることを確認してください)。

応答

すべてが成功すると、access_tokenrefresh_tokenid_tokentoken_type、およびexpires_inの値を含むペイロードとともにHTTP 200応答を受信します。
{
  "access_token": "eyJz93a...k4laUWw",
  "refresh_token": "GEbRxBN...edjnXbL",
  "id_token": "eyJ0XAi...4faeEoQ",
  "token_type": "Bearer",
  "expires_in": 36000
}
トークンは、検証してから保存します。操作方法については、「IDトークンの検証」および「アクセストークンを検証する」を参照してください。
リフレッシュトークンは、ユーザーが実質的に永久に認証された状態を維持できるようにするため、安全に保管しなければなりません。

リソース所有者のパスワードのフローと標準スコープ

パスワードの提供でフルアクセス権が与えられるため、パスワードベースの交換ではすべてのスコープにアクセスできるようになります。たとえば、要求にAPIスコープを含めなくても、アクセストークンにはすべてのAPIスコープが含まれます。同様に、要求にopenidスコープだけを含めた場合でも、openid標準のOpenID Connectスコープがすべて返されます。これらの場合、応答にはscopeパラメーターが含まれ、その値は発行されたスコープのリストになります。

ユーザー情報をIDトークンなしで取得する

ユーザー情報が必要な場合は、要求にopenidスコープを含めます。APIがRS256署名アルゴリズムとして使用している場合は、アクセストークンに/userinfoが有効なオーディエンスとして含まれ、これを使うと/userinfoエンドポイントを呼び出してユーザーのクレームを取得することができます。

APIを呼び出す

APIを呼び出すには、アプリケーションは、取得したアクセストークンをベアラートークンとしてHTTP要求の認証ヘッダーで渡さなければなりません。
curl --request GET \
  --url https://myapi.com/api \
  --header 'authorization: Bearer {accessToken}' \
  --header 'content-type: application/json'

リフレッシュトークン

このチュートリアルに従って次の作業を完了している場合、あなたはすでにリフレッシュ トークンを受け取っています。
  • オフラインアクセスを許可するように、APIを構成する。
  • 認可エンドポイントを通じて認証要求を開始するときに、offline_accessスコープを含める。
リフレッシュトークンを使って新しいアクセストークンを取得することができます。通常、新しいアクセストークンが必要になるのは、以前のトークンの期限が切れたときや、新しいリソースに初めてアクセスする場合に限られます。APIを呼び出すたびにエンドポイントを呼び出して新しいアクセストークンを取得するのは、良くない習慣です。Auth0は、同じIPから同じトークンを使って実行できるエンドポイントへの要求数を、レート制限を通じて調整します。 トークンを更新するには、grant_type=refresh_tokenを使用して、認証APIの/oauth/tokenエンドポイントに対してPOST要求を送信します。

トークンURLへのPOSTの例

curl --request POST \
  --url 'https://{yourDomain}/oauth/token' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=refresh_token \
  --data 'client_id={yourClientId}' \
  --data 'refresh_token={yourRefreshToken}'
パラメーター
パラメーター名説明
grant_typeこれをrefresh_tokenに設定します。
client_idアプリケーションのクライアントID。この値はアプリケーション設定で確認できます。
refresh_token使用するリフレッシュトークン。
scope(任意)要求されたスコープの権限をスペースで区切ったリスト。送信されない場合は、元のスコープが使用されます。送信する場合は、スコープを減らして要求することができます。これはURLでエンコードされている必要があります。

応答

すべてが成功すると、新しいaccess_token、秒単位の有効期間(expires_in)、付与されたscope値、およびtoken_typeを含むペイロードとともにHTTP 200応答を受信します。
{
  "access_token": "eyJ...MoQ",
  "expires_in": 86400,
  "scope": "openid offline_access",
  "token_type": "Bearer"
}
トークンは、検証してから保存します。操作方法については、「IDトークンの検証」および「アクセストークンを検証する」を参照してください。

サンプルユースケース

トークンをカスタマイズする

ルールを使用して、アクセストークンで返されたスコープを変更し、クレームをアクセスとIDトークンに追加することができます。(ルールの詳細については、「Auth0ルール」をお読みください。)これを行うには、ユーザーの認証後に実行される次のルールを追加します。
exports.onExecutePostLogin = async (event, api) => {
  // Add custom claims to Access Token and ID Token
  api.accessToken.setCustomClaim('https://foo/bar', 'value');
  api.idToken.setCustomClaim('https://fiz/baz', 'some other value');

  // Modify the scope of the Access Token
  api.accessToken.addScope('foo');
  api.accessToken.addScope('bar');
};
すべてのルールが実行された後、トークンでスコープが使用可能になります。
Auth0は、プロファイル情報をOpenID Connect(OIDC)仕様で定義されている構造化クレーム形式で返します。つまり、IDトークンまたはアクセストークンに追加するカスタムクレームは、衝突を避けるためにガイドラインと制限に従わなければなりません

レルムの対応を構成する

Auth0の拡張機能付与には、リソース所有者パスワード付与と似たような機能性がありますが、(別の接続にマッピングしている)別のユーザーディレクトリにして、フローで使用するものを個別に指定できるようになってます。 このバリエーションを使用するには、次のことを行う必要があります。
  • grant_type要求パラメーターをhttp://auth0.com/oauth/grant-type/password-realmに設定します。
  • realmという追加の要求パラメーターを送信し、それをユーザーが所属するレルムの名前に設定します。たとえば、内部の従業員用にemployeesという名前のデータベース接続を設定しており、そのユーザーがその接続に属している場合、realmemployeesに設定します。

レルムとしての接続

データベース接続パスワードレス接続AD/LDAPADFSAzure Active Directoryのエンタープライズ接続など、アクティブなアプリケーションに対応している接続はすべて、レルムとして構成できます。

MFAの構成

リソース所有者パスワードフローの使用が必要な反面、より強固な認証が要求される場合には、多要素認証()を追加することができます。方法については、「MFAでリソース所有者のパスワードフローを使って認証する」をお読みください。

攻撃防御の設定

リソース所有者のパスワードフローと総当たり攻撃から保護する機能を併用した場合には、一部の防御機能が無効になる可能性があります。ただし、いくつかの問題は回避することができます。詳細については、「リソース所有者のパスワードフローと攻撃防御のよくある不具合を回避する」をお読みください。

もっと詳しく

I