尝试使用 djangorestframework-simplejwt 和操作符 rxjs 刷新令牌时出错

Posted

技术标签:

【中文标题】尝试使用 djangorestframework-simplejwt 和操作符 rxjs 刷新令牌时出错【英文标题】:error when try refresh token with djangorestframework-simplejwt and operators rxjs in angular 【发布时间】: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 的新手,如果我的问题很愚蠢,我很抱歉。

【问题讨论】:

【参考方案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`
      
    );
  

【讨论】:

以上是关于尝试使用 djangorestframework-simplejwt 和操作符 rxjs 刷新令牌时出错的主要内容,如果未能解决你的问题,请参考以下文章

需要如何使用 djangorestframework-api-key 的示例

djangorestframework-jwt 不适合 http、https 吗?

djangorestframework:过滤相关字段

Django Rest Framework - 为啥在尝试使用不正确的凭据登录用户时返回 200 状态码?

对象没有属性'build_absolute_uri' - Django Rest Framework

04: DjangoRestFramework使用