首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postman -使用密钥文件的JWT身份验证

Postman -使用密钥文件的JWT身份验证
EN

Stack Overflow用户
提问于 2020-02-17 21:19:31
回答 3查看 3K关注 0票数 1

我正在尝试使用Postman来测试在Google Cloud平台上开发的API : API端点背后的应用程序引擎。

我有JSON格式的密钥文件:

代码语言:javascript
复制
{
  "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代码检索访问令牌:

代码语言:javascript
复制
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令牌?

EN

回答 3

Stack Overflow用户

发布于 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

票数 2
EN

Stack Overflow用户

发布于 2020-02-18 20:31:16

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

  • 自己创建一个JSON Web令牌,其中包括头部、声明集和签名。(签名需要来自服务帐户key.json文件的私钥)
  • 然后从GoogleJSON2.0Authorization Server.
  • Afterwards请求访问令牌,从OAuth响应中获取访问令牌,

授权服务器返回。

link中对此进行了说明。

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

票数 0
EN

Stack Overflow用户

发布于 2021-12-01 01:26:54

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

它只需要将代码复制到Postman集合的Pre-request脚本字段中,并在Postman环境中配置一些变量。

我做了这个小修改,以更新Google API令牌服务A,使作用域也可以通过环境变量进行配置:

代码语言:javascript
复制
--- 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环境中设置以下变量:

然后运行您的请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60263373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档