使用 Postman 和 JWT 的 JHipster 身份验证

JHipster authentication using Postman and JWT

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

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

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

可以将 Postman 与 JWT JHipster 应用程序一起使用。

  1. 首先,使用 JHipster 应用进行身份验证
  2. 检查 API 对 Authorization header 的请求。 JWT 令牌是 "Bearer " 右边的值。您还可以在 jhi-authenticationToken.
  3. 键下浏览器的 localStorage 中找到此令牌
  4. 在 Postman 中编辑 headers 并添加 Authorization header。该值应如下所示:

    Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJydRkZWxsIiwiYXV0aCI6IlJPTEVfQURNSU4sUk9MRV9U0VSIiwiZXhwIjoxNDgzOTg1MDkzfQ.1A13sBvr3KDWxJQpKDKOS33KAVjWIb3mS_qfxLBOCq_LbMwNHnysAai0SNXXgudMOulAnXYN9_Mzlcv1_zctA
    
  1. /api/authenticate 发出 POST 请求,正文如下: {"password":"admin","username":"admin"}。您将收到以下回复:{"id_token":"aabbccddeeff"}
  2. 使用上次调用中收到的令牌值进行后续请求,并将其放入 Authorization: Bearer aabbccddeeff
  3. 您可以检查身份验证的状态,向 /api/authenticate 端点发出 GET 请求

对我来说最简单的方法是

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

  2. Select 管理 > API

  1. 然后选择任何现有的 API 并单击 'Try it out' 按钮

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

如果您已经部署了单个微服务并且想要单独测试它,您可以将 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. 在授权选项卡内 select "Bearer token" 并在令牌输入字段中写入 {{jwt_token}}