web-dev-qa-db-ja.com

PostmanコレクションでOAuth2トークンを永続化する(または更新トークンを使用する)方法は?

目標

コレクションを実行する前に、すべての呼び出しの承認プロセスを個別に実行せずにコレクションを実行できるようにします。

私が試みた/気づいたこと

  1. PostmanでOAuth2承認ヘルパーを使用しているとき、返された更新トークンを保存する方法を発見していないため、アクセストークンの有効期限が切れたときに新しいトークンを取得するために使用します。 (この機能は、Postman Github Issuesのヘルパーに配置することをお勧めしました。)

  2. コレクションの最初にいくつかのステップを作成してヘルパーを複製しようとしましたが、承認/拒否にユーザーの操作が必要なステップを通過することはできません(それ以外の場合はセキュリティリスクであるため、理にかなっています)。ただし、OAuth2ヘルパーのように、ユーザーにプロンプ​​トを表示する方法を理解できないようです。

  3. 更新トークンに関する期待を一段下げて、リストの最初のテストで認証を実行し、アクセストークンを何らかの方法でグローバル変数または環境変数に保存してから、そのトークンを後続のすべてのテストが、OAuth2ヘルパーを介して生成されたアクセストークンを保存する方法を見つけていません。

これに解決策があり、それがコレクションを承認に費やす最小限の労力で実行できる結果になるかどうかを知りたいです。これは、すべてOAuth2承認を使用するコレクションに記述されたテストが増えるほど重要になります。

サイドノート:気付いていないクライアントに異なるものがある場合に備えて、私はPostman Macクライアントを使用しています。

26
Nate Ritter

私は答えを見つけました ここgithubで

まず、これらの環境変数を設定します。

  • url:(APIエンドポイント)
  • access_token:(空白)
  • refresh_token:(空白)
  • client_id:(クライアントID)
  • client_secret:(client_secret)
  • username:(ユーザー名)
  • password:(パスワード)

次に、passwordaccess_tokenを使用してgrant_typeを取得する新しい呼び出しを作成します。

私の場合、I POST to {{url}}/access_token。この呼び出しで送信されるのは、[ボディ]タブで指定されたform-dataキー/値ペアとしての次の情報です。

  • grant_typepassword
  • username{{username}}
  • password{{password}}
  • client_id{{client_id}}
  • client_secret{{client_secret}}

POST=を送信すると、次のような応答が返されます。

{
  "access_token": "kciOMpcmRcGTKfoo",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "DMGAe2TGaFbar"
}

次に、[テスト]タブで、次のコードを追加して、2つの環境変数access_tokenrefresh_tokenを割り当てました。

var data = JSON.parse(responseBody);
postman.setEnvironmentVariable("access_token", data.access_token);
postman.setEnvironmentVariable("refresh_token", data.refresh_token);

注:また、少なくともこの呼び出しが適切に機能することを確認するために、そこにテストを入れましたが、これは元の質問とは関係ありません:

var jsonData = JSON.parse(responseBody);
tests["token_type is Bearer"] = jsonData.token_type === "Bearer";

これで、私が作成する新しい呼び出しは、最初の呼び出しによって生成されたaccess_token{{access_token}}のような環境変数として使用できます。私の場合、コール/テストの[ヘッダー]タブに移動して、このキー/ペアを追加します。

  • AuthorizationBearer {{access_token}}

ボーナスポイント:ここでは例を挙げていませんが、理論的には、APIに対して現在の(空白ではない)access_tokenをテストし、失敗した場合は新しいスクリプトを取得する事前要求スクリプトを追加できます指定された(空白ではない)refresh_token。これにより、アクセストークンの期限切れを心配する必要がなくなります。

つまり、コレクション全体ではなくサブフォルダーのみを実行したい場合は、コレクション全体ではなくサブフォルダーのみを実行する必要があるため、コレクションのすべてのサブフォルダーにこの最初のaccess_token呼び出しを追加する必要があるため、このソリューションは好きではありません必ず新しいaccess_tokenがあります。そうしないと、access_tokenの有効期限が切れたときにすべてのテストが失敗します。コレクションランナーでサブフォルダーを個別に実行しない場合は、access_token呼び出しを1つだけ作成し、それをコレクションで実行する最初の呼び出しとして設定するだけで済みます。

しかし、そのため、これを正しい答えとしてマークするつもりはまだありません。私が思いついたものよりも良い答えがあると推測しています-理想的には、同じaccess_token呼び出し/テストを各サブフォルダーに複製する必要はありませんが、自動化された非対話型の利点を得るサブフォルダー自体またはコレクション全体を実行する柔軟性を備えたテスト。

14
Nate Ritter

まず、OAUTHトークンURLを入力し、[ボディ]タブをクリックして、これらのPOSTパラメーター:client_id、grant_type、username、password、override。

enter image description here

次に、[テスト]タブをクリックし、このテキストを入力して[送信]を押します。

var data = JSON.parse(responseBody);
postman.setGlobalVariable("access_token", data.access_token);
postman.setGlobalVariable("refresh_token", data.refresh_token);

enter image description here

次に、アプリケーションURLの1つを入力し、[ヘッダー]タブをクリックして、値Bearer {{access_token}}を使用してパラメーターAuthorizationを入力します。次に、「送信」をクリックします。

enter image description here

出来上がり!

41
Percy Vega

まず、 この回答を読む スレッドから。次に、これを質問の後半(コメントに基づく)と考えてください。

リフレッシュトークンの使用方法は?

  1. 新しいPOST=リクエストを作成します(access_tokenを調達するために作成したリクエストを複製するのが最も簡単です)。

enter image description here

  1. 本文で、usernamepasswordを削除します。 grant_typeを「refresh_token」に置き換えます。 refresh_tokenを値「{{refresh_token}}」で追加します。これは、最初に認証したときに作成された変数への参照です(覚えていました この回答を読んでください

enter image description here

  1. RefreshリクエストのTestsセクションがaccess_tokenおよびrefresh_tokenのPostman変数を上書きすることを確認してください。どうして?更新を実行するたびに、さらに別の更新トークンが取得されるためです。その新しい更新トークンをキャプチャしない場合、古い更新トークンを使用することになり、APIはそれを拒否します。次に、ステップ1から全体を再実行する必要があります(つまり this answer から)。

enter image description here

  1. これで、認証の有効期限が切れたときに、ユーザー名とパスワードを含む元のリクエストを実行する必要がなくなりました。作成したばかりのリクエストを使用して、永続的に更新できます。これは、コラボレーションを行い、APIアクセスを共有する必要があるが、ユーザー名/パスワードを共有したくない場合に特に役立ちます。

HTH!

1
HeyZiko

他の答えは両方とも正しいです。しかし、これを行うことができる別の方法があり、追加の要求を必要としません。このメソッドは、pre-requestを必要とするリクエストのaccess_tokenスクリプトを使用します。 postman-sandbox-api に記載されているpm.sendRequestを使用できます

事前要求スクリプトから、auth-token URLに要求を送信するだけです。すべての資格情報と更新トークンを送信します。応答では、アクセストークンを取得します。アクセストークンは、環境またはメモリ内に保持して使用できます。

サンプルコードここで要点を作りました https://Gist.github.com/harryi3t/dd5c61451206047db70710ff6174c3c1

// Set all these variables in an environment or at collection level
let tokenUrl = pm.variables.get('tokenUrl'),
    clientId = pm.variables.get('clientId'),
    clientSecret = pm.variables.get('clientSecret'),
    refreshToken = pm.variables.get('refreshToken'),
    requestOptions = {
      method: 'POST',
      url: tokenUrl,
      body: {
        mode: 'formdata',
        formdata: [
            {
                key: 'grant_type',
                value: 'refresh_token'
            },
            {
                key: 'client_id',
                value: clientId
            },
            {
                key: 'client_secret',
                value: clientSecret
            },
            {
                key: 'refresh_token',
                value: refreshToken
            }
        ]
      }
    };

console.log({ requestOptions });

pm.sendRequest(requestOptions, (err, response) => {
  let jsonResponse = response.json(),
      newAccessToken = jsonResponse.access_token;

  console.log({ err, jsonResponse, newAccessToken })

  // If you want to persist the token
  pm.environment.set('accessToken', newAccessToken);

  // Or if you just want to use this in the current request and then discard it
  pm.variables.set('accessToken', newAccessToken);
});

リクエストが送信されると、変数accessTokenが存在します。これは、リクエストで次のように使用できます。 enter image description here

注:Oauth2には4種類の付与タイプがあります。そのうちの2つ(認証コードと暗黙的)には、自動化できないブラウザーとの対話が必要です。ただし、サーバーがリフレッシュトークンを提供する場合、上記のスクリプトはアクセストークンを取得するのに役立ちます。他の2つのタイプ(クライアント資格情報とパスワード資格情報)は、ブラウザーとの対話を必要としません。したがって、これらはスクリプトから自動化できます。 client_credentialsを使用している場合は、上記のスクリプトを微調整してcodeからauthUrlを取得し、AuthTokenUrlからaccess_tokenを取得できます。

1
Harry