邮递员 - 使用密钥文件的 JWT 身份验证



我正在尝试使用Postman来测试在Google Cloud Platform上开发的API:API端点后面的App Engine。
我有 JSON 格式的密钥文件:

{
"type": "service_account",
"project_id": "[[my_project_name]]",
"private_key_id": "[[private_key_id]]",
"private_key": "-----BEGIN PRIVATE KEY-----n[[private_key]]n-----END PRIVATE KEY-----n",
"client_email": "[[service_account_email]]",
"client_id": "",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/[[service_account_email]]"
}

我能够使用 python 代码检索访问令牌:

import time
import google.auth.crypt
import google.auth.jwt
sa_keyfile='[[path_to_the_api_key_file]]'
sa_email='[[service_account_email]]'
audience='[[my_api_url]]'
expiry_length=3600
now = int(time.time())
payload = {
'iat': now,
"exp": now + expiry_length,
'iss': sa_email,
'aud':  audience,
'sub': sa_email,
'email': sa_email
}
signer = google.auth.crypt.RSASigner.from_service_account_file(sa_keyfile)
jwt = google.auth.jwt.encode(signer, payload)
print(jwt)

如果我在邮递员OAuth 2.0中设置为身份验证方法并将获得的 JWT 粘贴为Access Token那么请求工作正常。

我想将整个 JWT 令牌操作移动到 Postman 中,而无需提前调用 Python 代码。我尝试使用邮递员的Get New Access Token,但这两个选项都不支持 JSON 密钥文件。
是否可以仅使用邮递员从 JSON 密钥文件中获取 JWT 令牌?

有几种方法可以在 GCP 中授权用户。从本质上讲,谷歌的首选方法是使用密钥对签署请求并将其发送给谷歌以获得应用程序的真实性,并授权与上下文相关的 JWT。虽然有许多选项解释了如何在服务器端执行此操作,但您需要注意这些凭据实际上允许您访问平台本身。这本质上是oAuth工作流和JWT,您可以获得具有不同范围的不同源,这反过来又允许您调用与它们相关的端点。

对于邮递员,您遵循文档中提到的简单oAuth工作流程,这是直截了当的 创建客户端ID

当然,您需要实现服务器端部分来调用平台API,因为它们不应该直接公开,因此在获取平台令牌的同时获得签名请求提供了额外的安全性。

如果要授权最终用户,这是正确的指南:对用户进行身份验证 同一指南还有其他关于如何授权其他"类型"f应用程序的选项。

假设您使用OpenApi Specs作为访问RESTFUL API的标准方式。 Google提供了有关使用特定身份验证提供程序来使用其服务的大量文档。

选择身份验证方法

每种方法都有其优点和缺点,并选择最合适的方法,以适当的权限使用JWT。

其他文档可在此处找到 云端点文档

您可以尝试使用 Oauth 进行身份验证,使用 Postman 发出 HTTP 请求。该过程如下:

  • 自己创建一个 JSON Web 令牌,其中包含标头、声明 设置和签名。(签名需要服务帐户 key.json 文件中的私钥(
  • 然后从谷歌OAuth 2.0授权请求访问令牌 服务器。
  • 然后,从授权服务器返回的 JSON 响应
    中获取访问令牌。

此链接中有解释。

我认为这是可以做到的。无论哪种方式,如果必须经常这样做,我不认为这是一个实用的解决方案。

经过几个小时的研究,我在这里找到了Denis Loginov的解决方案:https://gist.github.com/dinvlad/425a072c8d23c1895e9d345b67909af0

它只需要将代码复制到邮递员集合的预请求脚本字段中,并在邮递员环境中配置一些变量。

我做了这个小修改来更新谷歌API令牌服务A,使范围也可以通过环境变量进行配置:

--- pre_request.js.orig 2021-12-01 00:54:19.000000000 +0000
+++ pre_request.js  2021-12-01 00:56:24.000000000 +0000
@@ -22,13 +22,8 @@
const ENV_TOKEN_EXPIRES_AT = 'tokenExpiresAt';
const ENV_ACCESS_TOKEN = 'accessToken';
+const ENV_SCOPE = 'scope';
const JS_RSA_SIGN_SRC = 'https://kjur.github.io/jsrsasign/jsrsasign-latest-all-min.js';
-const GOOGLE_OAUTH = 'https://www.googleapis.com/oauth2/v4/token';
-
-// add/remove your own scopes as needed
-const SCOPES = [
-    'https://www.googleapis.com/auth/userinfo.email',
-    'https://www.googleapis.com/auth/userinfo.profile',
-];
+const GOOGLE_OAUTH = 'https://oauth2.googleapis.com/token';
const EXPIRES_MARGIN = 300; // seconds before expiration
@@ -74,5 +69,5 @@
aud: GOOGLE_OAUTH,
iss: client_email,
-            scope: SCOPES.join(' '),
+            scope: getEnv(ENV_SCOPE),
iat,
exp,

(我在 gist.github.com 上的版本重命名了一些额外的环境变量,因为我更喜欢snake_case

然后在邮递员环境中设置以下变量:

  • serviceAccountKey(或service_account_key(:插入整个服务帐户凭据 JSON 文件,例如:
    {
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "client_email": "service-account@project-id.iam.gserviceaccount.com",
    "client_id": "12345678901234567890",
    "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/service-account%40project-id.iam.gserviceaccount.com",
    "private_key": "-----BEGIN PRIVATE KEY-----nMIIEv...Fn9tg==n-----END PRIVATE KEY-----n",
    "private_key_id": "b0a...68b",
    "project_id": "project-id",
    "token_uri": "https://oauth2.googleapis.com/token",
    "type": "service_account"
    }
    
  • scope:以空格分隔的 Google API 范围列表,例如:
    "https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.metadata"
    

然后运行您的请求。

最新更新