使用 Postman 和 JWT 进行 JHipster 身份验证
Posted
技术标签:
【中文标题】使用 Postman 和 JWT 进行 JHipster 身份验证【英文标题】:JHipster authentication using Postman and JWT 【发布时间】:2017-04-27 16:59:22 【问题描述】:我一直在使用 Postman 选项卡内扩展来测试调用 JHipster 资源 API 的调用,发现它运行良好(JHipster 设置使用 OAuth2)。我使用 JHipster 登录页面进行了身份验证,然后使用 Postman 扩展打开了一个新选项卡。
我刚刚将我的 JHipster 应用程序切换为使用 JWT,并且这种使用 Postman 的方法不再有效,调用 API 时我的权限被拒绝。此外,Postman 的标签内扩展已被弃用,取而代之的是独立应用。
问题:是否有任何关于设置 Postman 以针对 JHipster/JWT 进行身份验证的文档?
【问题讨论】:
【参考方案1】:如果您部署了单个微服务并且想要单独测试它,您可以配置 Postman 以使用预请求脚本构建 JWT 令牌。
-
进入JHipster生成的
application-dev.yml
文件,获取base64-secret
的值:
security:
authentication:
jwt:
# This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one)
base64-secret: N2Y2MmFkNzg2ZTI4NTZiZGEwMTZhYTAzOTBhMjgwMzlkMzU2MzRlZjJjZDA2MzQ0NGMxOGFlZThjOWY0MjkzNGVlOGE3ZjkxZGI5ZTQxOGY3MjEwNWUwYTUxMTUxODYxY2U4ZWMzZjVhMjg0NTZkNzlhNWUyMmEyNjQ5NzkxZmI=
将值放入 Postman 环境中名为 jhipster_jwt_secret
的变量中。
配置您的预请求脚本 (this is largely copied from a Gist):
function base64url(source)
// Encode in classical base64
encodedSource = CryptoJS.enc.Base64.stringify(source);
// Remove padding equal characters
encodedSource = encodedSource.replace(/=+$/, '');
// Replace characters according to base64url specifications
encodedSource = encodedSource.replace(/\+/g, '-');
encodedSource = encodedSource.replace(/\//g, '_');
return encodedSource;
var header =
"typ": "JWT",
"alg": "HS256"
;
var payload =
"sub": "user",
"auth": "role"
;
var secret = CryptoJS.enc.Base64.parse(postman.getEnvironmentVariable("jhipster_jwt_secret"));
// encode header
var stringifiedHeader = CryptoJS.enc.Utf8.parse(JSON.stringify(header));
var encodedHeader = base64url(stringifiedHeader);
// encode data
var stringifiedPayload = CryptoJS.enc.Utf8.parse(JSON.stringify(payload));
var encodedPayload = base64url(stringifiedPayload);
// build token
var token = encodedHeader + "." + encodedPayload;
// sign token
var signature = CryptoJS.HmacSHA256(token, secret);
signature = base64url(signature);
var signedToken = token + "." + signature;
postman.setEnvironmentVariable("jwt_token", signedToken);
-
在 Authorization 选项卡中选择“Bearer token”并在 Token 输入字段中输入
jwt_token
。
【讨论】:
正是我想要的,因为我有一个带有 JWT 身份验证的微服务。它工作得很好。非常感谢。 这是一个很好的建议。谢谢你。但是在这里我必须从 jhipster-registry 配置中获取秘密。您如何在没有 jhipster-registry 实例的情况下开发微服务?【参考方案2】:对我来说最简单的方法是
使用管理员凭据登录您的 Jhipster Web 应用程序
选择管理 > API
-
然后选择任何现有的 API 并单击“试用”按钮
它将列出带有令牌的curl
操作,现在您可以获取令牌并在 Postman 中使用它
【讨论】:
【参考方案3】:-
使用以下正文向
/api/authenticate
发出 POST 请求:
"password":"admin","username":"admin"
。您将收到以下回复:"id_token":"aabbccddeeff"
使用在上一次调用中收到的令牌值发出后续请求,并将其放入Authorization: Bearer aabbccddeeff
您可以检查身份验证的状态,向/api/authenticate
端点发出GET请求
【讨论】:
很遗憾,当我尝试使用默认管理员凭据时,我收到错误 403 对我来说, "type": "jhipster.tech/problem/problem-with-message", "title": "Unauthorized", "status": 401, "detail": "需要完整的身份验证才能访问它资源”,“路径”:“/api/authenticate”,“消息”:“error.http.401” 对我来说返回成功(200)但没有令牌。 我为此检查添加了示例 curl 调用 blog.mascix.com/2021/10/…【参考方案4】:可以将 Postman 与 JWT JHipster 应用程序一起使用。
-
首先,使用 JHipster 应用进行身份验证
检查
Authorization
标头的任何API 请求。 JWT 令牌是“Bearer”右侧的值。您还可以在浏览器的 localStorage 中找到此令牌,位于密钥 jhi-authenticationToken
下。
在 Postman 中编辑标题并添加 Authorization
标题。该值应如下所示:
Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJydRkZWxsIiwiYXV0aCI6IlJPTEVfQURNSU4sUk9MRV9U0VSIiwiZXhwIjoxNDgzOTg1MDkzfQ.1A13sBvr3KDWxJQpKDKOS33KAVjWIb3mS_qfxLBOCq_LbMwNHnysAai0SNXXgudMOulAnXYN9_Mzlcv1_zctA
【讨论】:
这行得通,但它是你知道的痛苦。在新登录后必须为每个请求复制粘贴授权会减慢速度,并且失去快速迭代的能力。 @geoidesic 使用环境变量。然后你就可以拥有你所有的 API,比如 Bearer token。以上是关于使用 Postman 和 JWT 进行 JHipster 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
在 DRF 中确定 IsAuthenticated 使用 DRF-JWT 检索使用 Postman 测试的列表