【问题标题】:error when try refresh token with djangorestframework-simplejwt and operators rxjs in angular尝试使用 djangorestframework-simplejwt 和操作符 rxjs 刷新令牌时出错
【发布时间】:2020-11-04 10:10:20
【问题描述】:

好吧,我尝试使用刷新令牌登录,但是当访问令牌过期时,不要刷新令牌。 我使用 djangorestframework-simplejwt 实现 jwt 和 angular 9 和 rxjs。当尝试刷新后端时返回类似

{ 访问:“asdsadlsadlsakdslañdksañldsakdsa”
}

但它与 rxjs 不兼容

refreshAccessToken() {
    return this.http.post<any>(something http )this.getRefreshToken() }, this.httpOptions).pipe(
        map(token => {
            console.log(token)
            this.setNewAccessToken(token['access'])        
         })
       )        
}
public setNewAccessToken(token:string){
    localStorage.setItem("access", token);
}

这里是生成的错误。 core.js:6189 错误类型错误:您在预期流的位置提供了“未定义”。您可以提供 Observable、Promise、Array 或 Iterable。

我是 rxjs 的新手,如果我的问题很愚蠢,我很抱歉。

【问题讨论】:

    标签: angular typescript django-rest-framework rxjs jwt


    【解决方案1】:

    我认为示例代码实际上不是有效代码,但我看到了一个典型错误。您忘记在管道后订阅。例如。 pipe(operators...).subscribe(token =&gt; {... do stuff };

    【讨论】:

      【解决方案2】:

      我只测试了这段代码 sn-p 但错误不是在你的实现中测试它,在阅读了更多关于 rxjs 的信息后,我明白什么时候应该使用 subcribe 。 T. van den Berg 有时不使用 subscribe 会在结果中产生错误是正确的。 在我的特殊情况下,不使用订阅。

      export class RefreshTokenService implements HttpInterceptor{
        private refrescarTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
        private ruta_refrescar_token = "http://127.0.0.1:8000/api/token/refresh/";
      
        constructor(public loginService:LoginService) { }
      
        intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
      
          if (this.loginService.get_token()) {
            request = this.addToken(request, this.loginService.get_token());
            this.refrescarTokenSubject.next(null);
          }
      
          return next.handle(request).pipe(catchError(error => {
            let refreshToken = localStorage.getItem('refresh')
            if (error.status === 401 && refreshToken !== null && error.url!==this.ruta_refrescar_token) {
              return this.manejarError401(request, next)
              //this.loginService.refreshAccessToken()
            } else {
              return throwError(error);
            }
          }));
        }
        
        private manejarError401(request: HttpRequest<any>, next: HttpHandler){
          this.refrescarTokenSubject.next(null)
      
          return this.loginService.refreshAccessToken().pipe(
            switchMap((token: any) => {
              console.log(token['access'])
              this.refrescarTokenSubject.next(token)
              return next.handle(this.addToken(request,this.loginService.get_token()))
            })
          )
        }
      
        private addToken(request: HttpRequest<any>, token: string) {
          return request.clone({
            setHeaders: {
              'Authorization': `Bearer ${token}`
            }
          });
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2022-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 2021-11-07
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        相关资源
        最近更新 更多