尝试使用 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 => ... 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 吗?
Django Rest Framework - 为啥在尝试使用不正确的凭据登录用户时返回 200 状态码?