我的 JWT 方法 - REST API

Posted

技术标签:

【中文标题】我的 JWT 方法 - REST API【英文标题】:My approach for JWT - REST API 【发布时间】:2016-11-03 08:46:52 【问题描述】:

我的问题是关于我使用 REST 实现的 JWT 方法。

我在客户端使用 AngularJS,在服务器端使用 php

第一次加载页面后,我会向服务器发送一个 GET 请求并从 Web 服务获取签名(编码签名)。

当有人打开网页时,我们会展示登录表单,当用户填写正确时,我们会将登录信息以 JWT 加密格式发送到服务器:

Header(ALGORITHM & TOKEN TYPE).Payload(Login form data).Signature(Received from the first GET web service call)

现在,登录后,我们从服务器获得了exp,即令牌过期超时数据。现在我们向已登录的用户显示另一种形式。它用于创建员工。所以,我的实现是:

我们展示表单(使用 angularjs) 用户输入数据 系统验证表单 如果表单条目正确,则系统触发addEmployee webservice。但是我们只传入header authorization bearer 的数据。例如:

Host: mysite.com POST: /services/addEmployee Accept: application/json Content-Type: application/json Authorization: Bearer Header(ALGORITHM & TOKEN TYPE).PAYLOAD(Employee form data + EXP token expire time received in the response of login web service).Signature

所以,这里我们不会在请求正文中传递任何内容。即使这是 POST 请求。而在服务器端,我们只需解码 Bearer 并获取有效载荷。

我真的不想以纯文本格式发送任何数据。例如,如果我们在 body 中发送 POST 数据,那么任何人都可以看到正在传递的内容。我想在某种程度上加密我的网络服务。这种方法是正确的还是有害的?

【问题讨论】:

为什么不使用 https? JWT 仅适用于 HTTPS。好吧,任何基于 cookie 的静态会话方案都只能通过 HTTPS 工作。 @MK。 JWT 适用于 HTTP 和 HTTPS。 @RobertMoskal 查看answer - 使用 Charles,任何人都可以非常轻松地调试 HTTPS 请求。 @MK.,没有加密,见我上面的 cmets。标头授权如下:Header Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ 【参考方案1】:

我认为你的方法是错误的。 JWT 有效负载无意保存敏感信息。任何人都可以阅读它。 您可以加密有效负载,但这不是 JWT 通常使用的方式。

通常,JWT 有效负载应包含不敏感或不特定于请求的声明(例如您的员工表单数据)。将这些数据保存在请求正文中,以便您可以将 JWT 重用于不同的 API 调用,无论您使用什么 HTTP 动词和参数来满足您的不同需求。

整个请求将使用 SSL 加密,因此您不会发送任何纯文本数据。切勿在没有 HTTPS 的情况下使用它,因为任何人都可以获取您的令牌并冒充用户。

希望对你有帮助,问候。

【讨论】:

以上是关于我的 JWT 方法 - REST API的主要内容,如果未能解决你的问题,请参考以下文章

WP REST API 的 JWT 身份验证:“找不到与 URL 和请求方法匹配的路由”

如何解码我在 Swift 中收到 REST API 的 JWT 令牌?

保护未经身份验证的 REST API

401/405 错误 Symfony 4 REST:Docker 上的 JWT API 身份验证(LexikJWTAuthenticationBundle)-ngnix

使用 Spring Boot 和 JWT 保护 REST Api

在 Rest API 中传递 JWT 令牌