【问题标题】:JWT token missing using http get method in angular 4在角度 4 中使用 http get 方法缺少 JWT 令牌
【发布时间】:2018-08-29 01:26:18
【问题描述】:

我正在使用 Angular 4 的 HTTPClient 模块从数据库中检索数据。 对应的服务有如下方法,

getPosts() {
        const httpHeaders = new HttpHeaders().set('Content-Type', 'application/json');
        // tslint:disable-next-line:max-line-length
        httpHeaders.set('Authorization for JWT', 'Token');
        return this.http.get('http://localhost:9090/api/user' + '?user_id=' + this.user.id.toString(),
    {headers: httpHeaders,
    responseType: 'json'});
    }

我从一个组件调用这个方法如下,

this.Servie.getPosts().subscribe(pos => {
     console.log(pos);
   });

但我在服务器端收到如下错误,

java.lang.RuntimeException: JWT 令牌丢失

客户端出错,

未能加载 http://localhost:9090/api/user?user_id=1:响应 预检具有无效的 HTTP 状态代码 500。

请纠正我哪里出错了?

我根据下面的讨论进行了更改,但仍然存在以下问题, 我想我现在搞砸了,我做了如下修改,
这是服务中写的代码,

const httpHeaders = new HttpHeaders()
    .set('Content-Type', 'application/json')
    // tslint:disable-next-line:max-line-length
    .set('RequestAuthorization', 'Bearer ' + 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI5ODg0NjUxMjMzIiwidXNlcklkIjoiNSJ9.gwiZcx5I8rInXJGANvS9twupXjdjrzFdZNZ0K85u-KA8LXXDgDf27mUzUoiEyxRMg');
    return this.http.get('http://localhost:9090/user' + '?user_id=' + this.user.id.toString(),
{headers: httpHeaders});

我正在调用上述服务,如下所示,

    this.userServie.getPosts().map((res: Response) =>
   console.log(res.text()));

但是服务没有命中,我没有在浏览器开发工具的网络选项卡中看到 GET 方法。我哪里错了?请纠正我。

【问题讨论】:

  • 如果我错了,请纠正我,但标题不应该是 ('Authorization' , 'Bearer' + jwt_token_here)
  • 承载者,你能告诉我这是什么吗?
  • stackoverflow.com/a/25850821/5283119 这是一个很好地解释承载和刷新令牌的链接。是的,您可以设置内容类型 application/json 但使用 JWT 令牌并不重要。 JWT 令牌是一种授权类型,用于告诉您的应用您就是您所说的自己。

标签: angular jwt httpclient angular4-httpclient


【解决方案1】:

标题具有定义的值。

httpHeaders.set('Authorization for JWT', 'Token');

应该是

httpHeaders.set('Authorization', 'Bearer ' + token);

如果您向服务器提供随机令牌,它当然会告诉您令牌丢失。在你的情况下,你发送这个

Authorization for JWT --> Token

【讨论】:

  • 我已经给出了正确的授权令牌,在邮递员软件中也是如此,出于安全考虑,这里我没有给出。
  • 你不应该那样做。看看它是如何误导的。显然你没有在你的令牌中使用Bearer,所以也许你应该试试我的回答。
  • (如果您只给我们您的代码,就没有安全漏洞,不用担心)
  • 好的,你能告诉我,Bearer 是什么吗?我对此有点陌生。请帮助我明白这一点。谢谢。
  • 因为它是('Authorization', 'Bearer ' + 'eyJh')。一定要在不记名者和你的令牌之间留一个空格。
【解决方案2】:

一旦你弄清楚要发送的真正标题,我认为你会遇到 2 个问题:

问题 #1

HttpHeaders 类是不可变的

所以你需要有这样的东西

const httpHeaders = new HttpHeaders()
.set('Content-Type', 'application/json')
.set('Authorization', 'Bearer [yourTokenHere]')

而不是声明 httpHeaders 并在不链接调用的情况下调用 set

const httpHeaders = new HttpHeaders();
//The line below has no effect on the httpHeaders instance
httpHeaders.set('Authorization', 'Bearer [yourTokenHere]');

问题 #2

另外,您是否确保在您的 java 服务器上正确配置了 CORS?

您收到关于preflight 请求(即带有选项方法的那个)缺少令牌的错误。 AFAIK,浏览器不会为预检请求发送自定义标头,例如 Authorization。因此,服务器不应检查 OPTIONS 请求的令牌(否则,您将始终得到 401,因为不会发送令牌)

【讨论】:

  • 嗨大卫,我正在尝试配置 CORS,但没有正确配置,请问我该怎么做?
  • 这取决于你的服务器,显然是java,我不知道。我确定其他 SO 用户也有这个问题
  • 参考link,我在服务器中配置CORS如下,@RestController @CrossOrigin(origins = "http://localhost:9090") public class UserController { @Autowired private UserService userService; @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<List<UserDomain>> getAvailable(@RequestParam("user") String user){ } }
  • 有效吗?可能还有更多工作要做stackoverflow.com/questions/37516755/…spring.io/blog/2015/06/08/cors-support-in-spring-framework 如果您阅读第二个链接上的 cmets,如果使用 sprint 4.1 或更早版本,您可能需要做更多工作。但是再一次,我不懂java
猜你喜欢
  • 2020-01-03
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 2021-09-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多