如何在角度2中使用自定义http刷新访问令牌?

2024-04-01

我在我的应用程序中使用基于令牌的身份验证。我的后端是使用restful服务(spring)开发的。后端代码很好地生成了所需的访问令牌和带有时间线的刷新令牌,所以我用以下内容覆盖了http类:

export class customHttp extends Http {
   headers: Headers = new Headers({ 'Something': 'Something' });
    options1: RequestOptions = new RequestOptions({ headers: this.headers });
    private refreshTokenUrl = AppSettings.REFRESH_TOKEN_URL;
    constructor(backend: ConnectionBackend,
        defaultOptions: RequestOptions,private refresh:OauthTokenService) {
        super(backend, defaultOptions);
    }
    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    console.log("custom http ");
        return super.request(url, options)
            .catch((err) => {
                if (err.status === 401) {
                    console.log(" custome http 401 ");
                    //   refresh the token
                    this.refresh.refresh().subscribe((tokenObj)=>{
                              console.log("tokenobj ");
                    })
                 } else {
                    console.log("err " + err);
                }
            }); } } 

由于出现循环依赖错误,我陷入了刷新刷新()方法中的令牌的困境,因此我尝试在另一个模块中使用刷新服务,但没有成功。我正在使用与此中提到的相同的方法使用 rxjs 处理刷新令牌 https://stackoverflow.com/questions/34907151/handling-refresh-tokens-using-rxjs任何帮助都会很棒!


这对我有用:

 request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    //adding access token to each http request before calling super(..,..)
    let token = this.authenticationService.token;
    if (typeof url === 'string') {
        if (!options) {
            options = { headers: new Headers() };
        }
        options.headers.set('Authorization', `Bearer ${token}`);
    }
    else {
        url.headers.set('Authorization', `Bearer ${token}`);
    }
    return super.request(url, options)
      .catch((error) => {
            //if got authorization error - try to update access token
            if (error.status = 401) {
                return this.authenticationService.updateToken()
                    .flatMap((result: boolean) => {
                        //if got new access token - retry request
                        if (result) {
                            return this.request(url, options);
                        }
                        //otherwise - throw error
                        else {
                            return Observable.throw(new Error('Can\'t refresh the token'));
                        }

                    })
            }
            else {
                Observable.throw(error);
            }
        })
}

更新:authenticationService.updateToken() 实现应取决于您使用的授权提供程序/授权机制。就我而言,它是 OAuth Athorization Server,因此实现基本上将正文中带有刷新令牌的 post 请求发送到配置的令牌 url,并返回更新的访问和刷新令牌。 tokenEndPointUrl 由 OAuth 配置并发出访问和刷新令牌(取决于发送的 grant_type)。因为我需要刷新令牌,所以我将 grant_type 设置为刷新令牌。代码看起来类似于:

updateToken(): Observable<boolean> {
    let body: string = 'refresh_token=' + this.refreshToken + '&grant_type=refresh_token';

    return this.http.post(tokenEndPointUrl, body, this.options)
        .map((response: Response) => {
            var returnedBody: any = response.json();
            if (typeof returnedBody.access_token !== 'undefined'){
              localStorage.setItem(this.tokenKey, returnedBody.access_token);
              localStorage.setItem(this.refreshTokenKey, returnedBody.refresh_token);
            return true;
        }
        else {
            return false;
        }
        })
}

希望能帮助到你

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在角度2中使用自定义http刷新访问令牌? 的相关文章

随机推荐

  • 跨 3 个平台的 Xamarin 移动应用版本号方案

    这里可能有多个相关的问题 我正在尝试为我们从单个 xamarin 解决方案构建的 3 个移动应用程序提出一个简单的版本号更新方案 我正在寻找一种简单的方法来保持所有这些值彼此同步 而不必四处走动并单独更新它们 Windows Phone 版
  • 将 Spring Security 3 与 Jersey Rest API 结合起来

    我有一个场景 我试图将 spring security 与 jersey 结合起来用于我的 REST API 我的需求相当复杂 我认为 如下 Spring security 用于拦截 url 并强制进行基本身份验证 以便访问 REST 资源
  • 如何在 Flask 中制作 RadioField?

    我有一个带有 TextField FileField 的表单 并且我想添加 RadioField 我想要一个有两个选项的单选字段 用户只能选择一个 我正在遵循前面两种有效形式的示例 我的 forms py 看起来像这样 from flask
  • 自定义 QPrintPreviewDialog

    是否可以自定义PrintPreviewDialog 我想界定放大和缩小功能 我知道这个问题已经有几个月了 但我花了相当长的时间才弄清楚 所以这里是 QPrintPreviewDialog preview printer this QList
  • 如何在 django 中指定索引类型? (btree 和 hash 对比等)

    就像标题所说 如何在 django 模型中的字段上指定我想要的索引类型 class Person age models IntegerField db index True 现在怎么办 我如何确保它是一个btree index而不是一个ha
  • 如何使用cgi python脚本在浏览器中显示pdf文件内容及其全名?

    我希望显示 pdf 文件的完整路径及其在浏览器上显示的内容 我的脚本有一个输入 html 用户将在其中输入文件名并提交表单 该脚本将搜索该文件 如果在子目录中找到该文件 则将文件内容输出到浏览器中并显示其名称 我能够显示内容 但无法同时显示
  • 为什么我无法使用 Select 从 onChange 获取值?

    测试表单的一部分 所以 现在我只想提醒用户选择什么 JS function getData title alert title PHP 生成的 HTML
  • 如何模糊匹配相邻单元格?

    我有一行 10 000 个名字 位于两个相应的列中 每列 10 000 个 A 列中的每个单元格对应于 B 列中的相邻单元格 我想进行模糊匹配 并获得所有单元格与相邻单元格的兼容性分数 我不希望它搜索整个列与整个列 只搜索相邻的单元格 我似
  • 在哪里下载signcode.exe和其他工具

    如果您决定签署代码 您将需要 签名代码 exe 生成证书文件 cert2spc exe pvk2pfx exe 下载这些工具的最佳位置是哪里 有没有办法在不下载大量 Microsoft Windows SDK 的情况下执行此操作 从视窗软件
  • AWS elemental mediaconvert 自动旋转视频?

    我正在使用 AWS elemental media Convert 将 mp4 视频转换为 HLS 一切正常 但输出视频旋转了 90 度 是否有一个设置可以用来阻止这种情况发生 我正在 iPhone 上拍摄视频 Under 输入 gt 视频
  • 如何制作顶部有锯齿边缘的 TileGroup 布局?

    我有包含按钮的spark components TileGroup 我希望按钮像选项卡一样出现在它们所服务的 ViewStack 顶部 目前 如果我在 TileList 中有 6 个项目 它会将其布局为 2 行 其中 4 个项目位于顶部拖曳
  • HTML5 视频的多个音轨

    我正在使用 HTML5 为我的网站制作视频 理想情况下 我只有一个无声视频文件 以及与视频同步的不同语言的五个不同音轨 然后我会有一个按钮 允许用户在音轨之间切换 甚至在视频播放时也是如此 正确的音轨就会出现 视频不会暂停或重新开始或任何其
  • 使用 Passport.js 进行动态失败重定向

    这是我的atm登录功能 app post login passport authenticate local failureRedirect login error 1 function req res res redirect req b
  • Firebase 聊天应用程序 setValue 公共数据库失败错误?

    我有一个使用 Firebase 的聊天应用程序 它一直有 x 处的 setValue 失败 数据库错误 权限被拒绝 每次我输入消息时都会出错 我已经将数据库设置为公开 service cloud firestore match databa
  • Python:查找列表元素之间的差异

    给定一个数字列表 如何找到每个 i 个元素及其 i 1 th 最好使用lambda表达式或者列表理解 例如 给定一个列表t 1 3 6 目标是找到一个列表v 2 3 因为3 1 2 6 3 3 etc gt gt gt t 1 3 6 gt
  • Pandas groupby 与 sklearn 预处理相结合

    我想按特定列对 DataFrame 进行分组 然后应用 sklearn 预处理 MinMaxScaler 并存储缩放器对象 我目前的出发点 import pandas as pd from sklearn import preprocess
  • OSX:安装 python 包时出错

    目前 由于 gcc 4 0 错误 我无法安装任何 Python 包 我将复制我收到的错误的两个示例 其中一个带有pip 另一个使用手动 setup py 构建 安装方法 sgarza62 pip install PIL Downloadin
  • 如何在 Cocoa AppKit 应用程序中实现缩放/缩放

    如何在 Cocoa AppKit 应用程序中实现缩放 缩放 即不最大化窗口 而是缩放窗口及其所有子视图 我认为它在 iOS 中称为 zoomScale 可以使用 Core Animations 或 Quartz 2D 来完成吗 例如CGCo
  • 在 Eclipse ide 中找不到 Scala 主类

    我为 eclipse 安装了 scala 和 scala IDE 每次我尝试编译一个简单的 HelloWorld 时 我都会收到此消息 package asd object testobject def main args Array St
  • 如何在角度2中使用自定义http刷新访问令牌?

    我在我的应用程序中使用基于令牌的身份验证 我的后端是使用restful服务 spring 开发的 后端代码很好地生成了所需的访问令牌和带有时间线的刷新令牌 所以我用以下内容覆盖了http类 export class customHttp e