使用 JWT 和 JSONAPI 进行身份验证

Posted

技术标签:

【中文标题】使用 JWT 和 JSONAPI 进行身份验证【英文标题】:Authentication with JWT and JSONAPI 【发布时间】:2016-04-20 20:35:35 【问题描述】:

我正在使用以下技术/方法实现 REST API:

JSONAPI

JWT token

我想实现身份验证端点,它应该在 JSONAPI 格式的 POST 请求中接收用户名和密码,并以 JSONAPI 格式返回 JWT 令牌。 但我发现有些矛盾不允许我 100% 使用 RESTful:

我们将端点命名为/tokens,因为它实际上创建了令牌。响应也是tokens 类型的资源,例如:


  "data": 
    "type": "tokens",
    "attributes": 
      "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEifQ.ivJ5P23wqVo3w31flg3aOu7er--Ijght_RrBf_MuqsU",
    
  

但是请求呢? usernamepassword 是用户的属性,但它们应该发送到 /tokens 端点。如果我将users 资源发送到/tokens 端点,它没有多大意义。

有没有办法解决这个问题,遵循 JSONAPI 并保持 API 有意义?

【问题讨论】:

在这些情况下,我所做的是拥有一个会话对象或实体,它包含您提到的属性,我不在乎它们来自用户,因为用户是进行身份验证的人。在任何情况下,JSONAPI 和 REST 都是很好的指南,但在需要时应用您的风格。 【参考方案1】:

如果我将用户资源发送到 /tokens 端点,它没有多大意义。

为什么不呢? REST 不强制您只将用户发送到用户资源。当然,当您对用户资源进行 CRUD 操作时,您将通过用户资源端点执行此操作。

但是要生成令牌,将用户资源发送到令牌端点是完全合理的。

【讨论】:

您好,感谢您的回复。 > REST 不强制您只将用户发送到用户资源。 REST 没有,但 REST API 规范可以。这就是问题所在。【参考方案2】:

您还可以通过 HTTP 授权标头或作为 JSON 有效负载的*** meta 属性的一部分提供用户凭据。

【讨论】:

以上是关于使用 JWT 和 JSONAPI 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring 和 JWT 进行基于令牌的身份验证

NestJs 使用 jwt 和私钥和公钥进行身份验证

在 feathersjs 中使用 JWT 进行身份验证和会话处理

使用机器对机器和基于用户的身份验证使用 JWT 进行嵌套身份验证和授权是一回事吗?

使用 JWT 进行身份验证的最佳实践

django rest framework jwt 使用电子邮件和密码进行身份验证