使用 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 测试的列表

如何使用 Postman 测试 jwt 身份验证

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

使用 JWT 创建 PostMan GET 请求

使用 passport-jwt 进行 JWT 身份验证不考虑到期日期

使用 JWT 访问 Rest API 适用于 Postman 但不适用于 Axios