目標
コレクションを実行する前に、すべての呼び出しの承認プロセスを個別に実行せずにコレクションを実行できるようにします。
私が試みた/気づいたこと
PostmanでOAuth2承認ヘルパーを使用しているとき、返された更新トークンを保存する方法を発見していないため、アクセストークンの有効期限が切れたときに新しいトークンを取得するために使用します。 (この機能は、Postman Github Issuesのヘルパーに配置することをお勧めしました。)
コレクションの最初にいくつかのステップを作成してヘルパーを複製しようとしましたが、承認/拒否にユーザーの操作が必要なステップを通過することはできません(それ以外の場合はセキュリティリスクであるため、理にかなっています)。ただし、OAuth2ヘルパーのように、ユーザーにプロンプトを表示する方法を理解できないようです。
更新トークンに関する期待を一段下げて、リストの最初のテストで認証を実行し、アクセストークンを何らかの方法でグローバル変数または環境変数に保存してから、そのトークンを後続のすべてのテストが、OAuth2ヘルパーを介して生成されたアクセストークンを保存する方法を見つけていません。
これに解決策があり、それがコレクションを承認に費やす最小限の労力で実行できる結果になるかどうかを知りたいです。これは、すべてOAuth2承認を使用するコレクションに記述されたテストが増えるほど重要になります。
サイドノート:気付いていないクライアントに異なるものがある場合に備えて、私はPostman Macクライアントを使用しています。
私は答えを見つけました ここgithubで 。
まず、これらの環境変数を設定します。
url
:(APIエンドポイント)access_token
:(空白)refresh_token
:(空白)client_id
:(クライアントID)client_secret
:(client_secret)username
:(ユーザー名)password
:(パスワード)次に、password
access_token
を使用してgrant_type
を取得する新しい呼び出しを作成します。
私の場合、I POST to {{url}}/access_token
。この呼び出しで送信されるのは、[ボディ]タブで指定されたform-data
キー/値ペアとしての次の情報です。
grant_type
:password
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_token
とrefresh_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}}
のような環境変数として使用できます。私の場合、コール/テストの[ヘッダー]タブに移動して、このキー/ペアを追加します。
Authorization
:Bearer {{access_token}}
ボーナスポイント:ここでは例を挙げていませんが、理論的には、APIに対して現在の(空白ではない)access_token
をテストし、失敗した場合は新しいスクリプトを取得する事前要求スクリプトを追加できます指定された(空白ではない)refresh_token
。これにより、アクセストークンの期限切れを心配する必要がなくなります。
つまり、コレクション全体ではなくサブフォルダーのみを実行したい場合は、コレクション全体ではなくサブフォルダーのみを実行する必要があるため、コレクションのすべてのサブフォルダーにこの最初のaccess_token呼び出しを追加する必要があるため、このソリューションは好きではありません必ず新しいaccess_tokenがあります。そうしないと、access_tokenの有効期限が切れたときにすべてのテストが失敗します。コレクションランナーでサブフォルダーを個別に実行しない場合は、access_token呼び出しを1つだけ作成し、それをコレクションで実行する最初の呼び出しとして設定するだけで済みます。
しかし、そのため、これを正しい答えとしてマークするつもりはまだありません。私が思いついたものよりも良い答えがあると推測しています-理想的には、同じaccess_token呼び出し/テストを各サブフォルダーに複製する必要はありませんが、自動化された非対話型の利点を得るサブフォルダー自体またはコレクション全体を実行する柔軟性を備えたテスト。
まず、OAUTHトークンURLを入力し、[ボディ]タブをクリックして、これらのPOSTパラメーター:client_id、grant_type、username、password、override。
次に、[テスト]タブをクリックし、このテキストを入力して[送信]を押します。
var data = JSON.parse(responseBody);
postman.setGlobalVariable("access_token", data.access_token);
postman.setGlobalVariable("refresh_token", data.refresh_token);
次に、アプリケーションURLの1つを入力し、[ヘッダー]タブをクリックして、値Bearer {{access_token}}を使用してパラメーターAuthorizationを入力します。次に、「送信」をクリックします。
出来上がり!
まず、 この回答を読む スレッドから。次に、これを質問の後半(コメントに基づく)と考えてください。
リフレッシュトークンの使用方法は?
username
とpassword
を削除します。 grant_type
を「refresh_token」に置き換えます。 refresh_token
を値「{{refresh_token}}」で追加します。これは、最初に認証したときに作成された変数への参照です(覚えていました この回答を読んでください ?)HTH!
他の答えは両方とも正しいです。しかし、これを行うことができる別の方法があり、追加の要求を必要としません。このメソッドは、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
が存在します。これは、リクエストで次のように使用できます。
注:Oauth2には4種類の付与タイプがあります。そのうちの2つ(認証コードと暗黙的)には、自動化できないブラウザーとの対話が必要です。ただし、サーバーがリフレッシュトークンを提供する場合、上記のスクリプトはアクセストークンを取得するのに役立ちます。他の2つのタイプ(クライアント資格情報とパスワード資格情報)は、ブラウザーとの対話を必要としません。したがって、これらはスクリプトから自動化できます。 client_credentialsを使用している場合は、上記のスクリプトを微調整してcode
からauthUrl
を取得し、AuthTokenUrl
からaccess_token
を取得できます。