我正在尝试使用Postman来测试在Google Cloud平台上开发的API : API端点背后的应用程序引擎。
我有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)如果我将Postman OAuth 2.0设置为身份验证方法,并将获得的JWT粘贴为Access Token,那么请求就可以正常工作。
我希望将整个JWT令牌操作转移到Postman中,而不需要提前调用Python代码。我尝试使用Postman中的Get New Access Token,但两个选项都不支持JSON密钥文件。
是否可以仅使用Postman从JSON密钥文件中获取JWT令牌?
发布于 2020-02-17 21:41:13
在GCP中,有几种方法可以授权用户。本质上,google的首选方法是使用密钥对来签署请求,并将其发送到google以验证应用程序的真实性,并授权与上下文相关的JWT。虽然有许多选项可以解释如何在服务器端执行此操作,但您需要意识到,这些凭据实际上允许您访问平台本身。这本质上是oAuth工作流和JWT,你可以得到不同的源,具有不同的作用域,这反过来又允许你调用与它们相关的端点。
对于邮递员,您可以遵循文档中提到的简单oAuth工作流,它是直接的Creating client IDs
当然,您需要实现服务器端部件来调用平台API,因为它们不应该直接公开,因此在获取平台令牌的同时获得签名的请求会提供额外的安全性。
如果你想授权最终用户,这是正确的指南:Authenticating users相同的指南有关于如何授权其他类型的应用程序的其他选项。
假设您使用OpenApi规范作为其访问RESTFUL apis的标准方式。Google有大量文档介绍如何使用特定的身份验证提供商来使用他们的服务。
Choosing an Authentication Method
每种方法都有其优缺点,并选择最合适的方法,以适当的权限使用JWT。
可在此处找到其他文档Cloud Endpoints documentation
发布于 2020-02-18 20:31:16
您可以尝试使用Oauth进行身份验证,使用Postman发出HTTP请求。该过程如下:
授权服务器返回。
此link中对此进行了说明。
我认为这是可以做到的。无论哪种方式,如果必须经常这样做,我都不认为这是一个实际的解决方案。
发布于 2021-12-01 01:26:54
经过几个小时的研究,我在这里找到了Denis Loginov的解决方案:https://gist.github.com/dinvlad/425a072c8d23c1895e9d345b67909af0
它只需要将代码复制到Postman集合的Pre-request脚本字段中,并在Postman环境中配置一些变量。
我做了这个小修改,以更新Google 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,(因为我更喜欢snake_case,所以My version on gist.github.com重命名了一些额外的环境变量。)
然后在您的Postman环境中设置以下变量:
serviceAccountKey (或JSON ):插入您的整个服务帐号凭证"service-account@project-id.iam.gserviceaccount.com",文件,例如:{ "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","auth_uri":"https://accounts.google.com/o/oauth2/auth","client_email":JSON "client_id":"12345678901234567890","client_x509_cert_url":"https://www.googleapis.com/robot/v1/metadata/x509/service-account%40project-id.iam.gserviceaccount.com","private_key":“-开始私钥-\nMIIEv...Fn9tg==\n-结束私钥-\n”,"private_key_id":"b0a...68b","project_id":“项目id”,"token_uri":"https://oauth2.googleapis.com/token",“类型”:"service_account“}scope:以空格分隔的Google API作用域列表,例如:"https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.metadata"然后运行您的请求。
https://stackoverflow.com/questions/60263373
复制相似问题