【问题标题】:JHipster authentication using Postman and JWT使用 Postman 和 JWT 进行 JHipster 身份验证
【发布时间】:2017-04-27 16:59:22
【问题描述】:

我一直在使用 Postman 选项卡内扩展来测试调用 JHipster 资源 API 的调用,发现它运行良好(JHipster 设置使用 OAuth2)。我使用 JHipster 登录页面进行了身份验证,然后使用 Postman 扩展打开了一个新选项卡。

我刚刚将我的 JHipster 应用程序切换为使用 JWT,并且这种使用 Postman 的方法不再有效,调用 API 时我的权限被拒绝。此外,Postman 的标签内扩展已被弃用,取而代之的是独立应用。

问题:是否有任何关于设置 Postman 以针对 JHipster/JWT 进行身份验证的文档?

【问题讨论】:

    标签: jwt jhipster postman


    【解决方案1】:

    如果您部署了单个微服务并且想要单独测试它,您可以配置 Postman 以使用预请求脚本构建 JWT 令牌。

    1. 进入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=
    
    1. 将值放入 Postman 环境中名为 jhipster_jwt_secret 的变量中。

    2. 配置您的预请求脚本 (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);
    
    1. 在 Authorization 选项卡中选择“Bearer token”并在 Token 输入字段中输入{{jwt_token}}

    【讨论】:

    • 正是我想要的,因为我有一个带有 JWT 身份验证的微服务。它工作得很好。非常感谢。
    • 这是一个很好的建议。谢谢你。但是在这里我必须从 jhipster-registry 配置中获取秘密。您如何在没有 jhipster-registry 实例的情况下开发微服务?
    【解决方案2】:

    对我来说最简单的方法是

    1. 使用管理员凭据登录您的 Jhipster Web 应用程序

    2. 选择管理 > API

    1. 然后选择任何现有的 API 并单击“试用”按钮

    它将列出带有令牌的curl 操作,现在您可以获取令牌并在 Postman 中使用它

    【讨论】:

      【解决方案3】:
      1. 使用以下正文向/api/authenticate 发出 POST 请求: {"password":"admin","username":"admin"}。您将收到以下回复:{"id_token":"aabbccddeeff"}
      2. 使用在上一次调用中收到的令牌值发出后续请求,并将其放入Authorization: Bearer aabbccddeeff
      3. 您可以检查身份验证的状态,向/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 应用程序一起使用。

      1. 首先,使用 JHipster 应用进行身份验证
      2. 检查Authorization 标头的任何API 请求。 JWT 令牌是“Bearer”右侧的值。您还可以在浏览器的 localStorage 中找到此令牌,位于密钥 jhi-authenticationToken 下。
      3. 在 Postman 中编辑标题并添加 Authorization 标题。该值应如下所示:

        Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJydRkZWxsIiwiYXV0aCI6IlJPTEVfQURNSU4sUk9MRV9U0VSIiwiZXhwIjoxNDgzOTg1MDkzfQ.1A13sBvr3KDWxJQpKDKOS33KAVjWIb3mS_qfxLBOCq_LbMwNHnysAai0SNXXgudMOulAnXYN9_Mzlcv1_zctA
        

      【讨论】:

      • 这行得通,但它是你知道的痛苦。在新登录后必须为每个请求复制粘贴授权会减慢速度,并且失去快速迭代的能力。
      • @geoidesic 使用环境变量。然后你就可以拥有你所有的 API,比如 Bearer {{token}}。
      猜你喜欢
      • 2016-04-20
      • 2019-08-18
      • 2016-04-07
      • 2017-11-25
      • 2023-03-27
      • 2021-05-29
      • 2017-07-30
      • 2018-06-30
      • 2018-08-03
      相关资源
      最近更新 更多