AngularJS SPA 需要重新加载以识别 localstorage 中的 jwt 令牌

Posted

技术标签:

【中文标题】AngularJS SPA 需要重新加载以识别 localstorage 中的 jwt 令牌【英文标题】:AngularJS SPA needs to reload to recognize the jwt token in localstorage 【发布时间】:2018-08-04 11:49:33 【问题描述】:

一切都好吗?

今天我需要您的帮助来解决我的 SPA AngularJS 应用程序中的令牌身份验证问题 (jwt)(我在后端使用 NodeJS)。

当我登录时,凭据会在后端进行验证,如果成功,我会获得一个存储在本地存储中的令牌。

但是当我开始向受保护的端点发出请求时,它无法访问,足以使两者都必须重新加载页面,这对我的 SPA AngularJS 应用程序来说是一个悲剧。

我还有两种用于检查令牌的验证方法:

isLoggedIn: 验证令牌尚未发出。

currentUser:获取令牌有效负载中的用户数据。

这两个方法由导航栏控制器调用,更新导航栏的链接和用户名。

最后一点是:我有一个方法:注销,它不包括令牌,但即使删除后我也必须重新加载页面,否则我仍然可以向受保护的端点发出请求,并且不得不重新加载我的 SPA 是一个悲剧.

我希望我已经向您提供了有关问题的所有详细信息,

最好的问候

【问题讨论】:

我发现问题出在使用 $ 资源发出的请求中,当我使用 $ http 时它工作正常,但我需要使用 $ 资源,因为我正在使用 Restful api。因此,简要总结一下我在 $ 资源中传递 jwt 标头的方式存在什么问题。但是正确的方法是什么? 【参考方案1】:

问题解决了。

我使用的是angularjs的$资源,并将token作为对象传递到headers中,如下所示,直接在对象上调用调用localstorage的token的方法。

return $resource('user/:userId', null, 

      'update': 
        method: 'PUT',
        headers: 
          Authorization: 'Bearer ' + AuthService.getToken();
        
      ;

所以我改了,创建了一个变量token并调用了调用token的方法,然后把变量token传给了对象中的headers。

var token = AuthService.getToken();

    return $resource('user/:userId', null, 

      'update': 
        method: 'PUT',
        headers: 
          Authorization: 'Bearer ' + token
        
      ,

【讨论】:

【参考方案2】:

不确定您的身份验证流程是什么,但您需要一个可以根据当前状态获取或发布令牌的 http 服务。

类似

  get(url: string, options?: RequestOptionsArgs, silent: boolean = false): Observable<Response> 
  let getStream = () => 
    return Observable.from([true])
      .flatMap((_) => 
        if (!silent) this.beginActivity();
        return this.authHttp.get(url, this.prepareOptionsForJsonApi(options));
      )
      .catch((res) =>  return this.handleError(res); )
      .do(noop,
      (error) =>  this.publishError(error); ,
      () =>  if (!silent) this.endActivity(); );
  ;

  return this.whenTokenReady(getStream);


  post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> 
  let postStream = () => 
    return Observable.from([true])
      .flatMap((_) => 
        this.beginActivity();
        return this.authHttp.post(url, body, this.prepareOptionsForJsonApi(options));
      )
      .catch((res) =>  return this.handleError(res); )
      .do(noop,
      (error) =>  this.publishError(error); ,
      () =>  this.endActivity(); );
  ;

  return this.whenTokenReady(postStream);

【讨论】:

【参考方案3】:
    如果您希望在不刷新应用程序的情况下在每个请求中使用登录令牌,那么您必须创建一个拦截器或服务,在其中设置您的令牌选项,它会随您的每个请求一起使用。

You can refer to this article and let me know further if any query (Click me!).

    确保点击退出

    localStorage.setItem('isLoggedIn', JSON.stringify(false)); this.currentUser("");

【讨论】:

以上是关于AngularJS SPA 需要重新加载以识别 localstorage 中的 jwt 令牌的主要内容,如果未能解决你的问题,请参考以下文章

微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决

在 angularjs SPA 中使用 Knockout 组件

angularjs ui-route:仅更改 1 个嵌套视图并保存其他视图以防止重新加载

SPA 的概念

AngularJS SPA 使用 API 和 Mongoose

使用 AngularJS 服务重新加载 JSON 源