当前位置: 首页 > 知识库问答 >
问题:

Angular 10应用程序不会在跨原点请求时发送JWT刷新令牌

冯星剑
2023-03-14

我们在同一台开发机器上的不同端口上有一个Angular前端和一个web服务。web服务被配置为允许从本地主机和Angular应用程序所在的端口进行访问。

我们使用JWT认证,它用于对web服务的初始认证。我们接收一个auth令牌并将其存储在Angular本地存储中,还接收一个刷新令牌,该令牌存储为一个设置了HttpOnly的cookie。目前,我们处于一个开发环境中,在这个环境中,SSL在客户端或web服务上都没有启用。

当我们的授权令牌过期时,问题就来了。我们的应用程序发送了一个更新令牌的请求,但是该请求没有刷新令牌cookie。

我们尝试在Angular中设置一个代理,将API请求从Angulal域转发到web服务。在这种情况下,刷新令牌cookie被转发到web服务,我们得到新的令牌。不幸的是,在构建和部署应用程序后,这将不起作用,我们需要能够在未启用SSL的环境中部署和开发。

下面是 Angular 应用程序中处理发送刷新令牌的相关代码。下面是在授权服务中调用的方法。

public refreshToken() {
    return this.http.post(this.appConfigService.getGrouperWebServiceUrl()+'/auth/refresh', {})
      .pipe(
        map((res: LoginResponse) => {
          this.setSession(res);
          return res;
        })
      );
}    

POST请求被Angular拦截器拦截。

intercept(req: HttpRequest < any > , next: HttpHandler):
    Observable < HttpEvent < any >> {
    // ... 
     
        if (req.url.indexOf('refresh') !== -1) {
            console.log("token interceptor: refresh");
            return next.handle(this.configureRefresh(req));
        }
    // ...    
}

configureRefresh(req: HttpRequest < any > ) {
    return req.clone({
        withCredentials: true
    });
}

下面是使用 Angular 代理的刷新请求的原始请求,因此该请求似乎来自与 Web 服务相同的来源。请注意,刷新令牌 cookie 包含在请求中。

POST /proxy/auth/refresh HTTP/1.1
Host: localhost:4200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
Content-Length: 2
Origin: http://localhost:4200
Connection: keep-alive
Referer: http://localhost:4200/userHome
Cookie: refreshToken=/*token redacted*/

下面是在没有代理的情况下刷新的原始请求。请注意,刷新令牌 cookie 不包含在请求中。

POST /auth/refresh HTTP/1.1
Host: localhost:8081
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
Content-Length: 2
Origin: http://localhost:4200
Connection: keep-alive
Referer: http://localhost:4200/userHome

当我们进行跨源请求时,如何让refreshToken cookie包含在请求头中?

我们确实https://stackoverflow.com/a/46412839/8517076看到了这个响应,但似乎没有帮助。我们已经在Web服务中设置了推荐的标头。

共有1个答案

轩辕实
2023-03-14

您的localhost连接必须是安全的(https)。这是必需的!

您需要创建SSL证书并在Angular应用程序中使用,如此处所述。

就我而言,当我使用 SSL 证书重新启动我的 Angular 应用程序时,refresh_token会自动以请求标头发送(作为“cookie”属性)。

 类似资料:
  • 我正在尝试使用node.js、socket.io和express制作一个简单的聊天应用程序。但是,如果我单击main.jade文件中的send按钮,页面会刷新,并且不会出现任何消息。我在Firebug中也遇到这个错误: 加载页面时,与ws:/127.0.0.1:3000/socket.io/?eio=2&transport=websocket&sid=d_hnmpdxhed-j7lraaah的连接

  • 在一个小项目上工作并使用jwt令牌进行了一些身份验证,整个过程如下所示: < li >在auth/register上生成jwt令牌以及刷新令牌 < li >使用令牌发出请求 < li >如果令牌过期,我将查询请求用户及其refreshToken,比较其当前请求refreshToken和数据库令牌 < li >如果令牌匹配,我将生成一个新令牌和一个新刷新令牌。 整个问题是第五步,假设我向“/me/f

  • 我正在尝试从应用程序服务中获取Google的刷新令牌,但我不能。 日志说 2016-11-04T00:04:25 PID[500]收到的详细请求:获取https://noteappsvr.azurewebsites.net/.auth/login/google?access _ type = offline 2016-11-04t 00:04:25 PID[500]从https://account

  • 我正在构建一个移动应用程序,并且正在使用JWT进行身份验证。 最好的方法似乎是将JWT访问令牌与刷新令牌配对,这样我就可以根据需要频繁地使访问令牌过期。 刷新令牌是什么样子的?是随机字符串吗?那串加密了吗?是另一个JWT吗? 刷新令牌将存储在用户模型的数据库中以便访问,对吗?在这种情况下似乎应该加密 在用户登录后,我是否会将刷新令牌发送回,然后让客户端访问单独的路由来检索访问令牌?

  • 目前,我有一个变量来指示标记刷新是否在中进行,在这种情况下,我取消中的所有后续请求,用户必须手动刷新页面,否则我可以注销用户并强制用户登录。 对于上述问题,使用OKHTTP3.x for Android有什么好的解决方案或架构? 编辑:我想解决的问题是一般的,我不想顺序我的电话。也就是说,等待一个调用完成并刷新令牌,然后只在活动和片段级别上发送请求的其余部分。