gpt4 book ai didi

Angular2 - 如何最好地处理过期的身份验证 token ?

转载 作者:太空狗 更新时间:2023-10-29 16:58:41 25 4
gpt4 key购买 nike

我正在使用 Angular 2.1.2。

我有一个身份验证 token (使用 angular2-jwt),如果它过期,我的 webApi 调用将失败并出现 401 错误。我正在寻找一种用户不会丢失任何输入数据的解决方案。

我可以捕获此 401 并使用登录名打开模式。然后用户登录,模式消失,他们看到他们的输入屏幕。但是,失败的请求显示错误,因此我需要重新处理请求。如果是路由器导航,则初始数据尚未加载。

我可以重新加载页面,但如果我 router.navigate 到同一页面,它似乎并没有真正重新加载页面。我不想在单页应用程序上重新加载整页。有没有办法强制 router.navigate 运行,即使它是当前页面?

重新导航仍然是个问题,因为我会丢失所有未保存的新输入数据。

理想情况下,请求只会“暂停”,直到用户从模式登录。我还没有找到实现它的方法。

有什么想法吗?有最佳实践吗?

最佳答案

通常我会自己提供一个HttpService,而不是直接使用Http。因此,根据您的要求,我可以提供我自己的 get() 方法,以便在发送任何真正的 HTTP 请求之前链接身份验证。

这是服务:

@Injectable()
class HttpService {
constructor(private http: Http, private auth: Authentication) {}

public get(url: string): Observable<Response> {
return this.auth.authenticate().flatMap(authenticated => {
if (authenticated) {
return this.http.get(url);
}
else {
return Observable.throw('Unable to re-authenticate');
}
});
}
}

这是调用服务的组件:

@Component({
selector: 'my-app',
template: `<h1>Hello {{name}}</h1>
<button (click)="doSomething()">Do Something</button>

<div [hidden]="!auth.showModal">
<p>Do you confirm to log in?</p>
<button (click)="yes()">Yes</button><button (click)="no()">No</button>
</div>
`,
})
export class AppComponent {
name = 'Angular';

constructor(private httpSvc: HttpService, public auth: Authentication) {}

ngOnInit() {
}

doSomething() {
let a = this.httpSvc.get('hello.json').subscribe(() => {
alert('Data retrieved!');
}, err => {
alert(err);
});
}

yes() {
this.auth.confirm.emit(true);
}

no() {
this.auth.confirm.emit(false);
}
}

通过链接可观察对象,Authentication 服务确定是否中断正常流程以显示模态(虽然目前仅与 App 组件一起使用,但它当然可以单独实现)。一旦从对话中收到肯定的回答,服务就可以恢复流程。

class Authentication {
public needsAuthentication = true;
public showModal = false;
public confirm = new EventEmitter<boolean>();

public authenticate(): Observable<boolean> {
// do something to make sure authentication token works correctly
if (this.needsAuthentication) {
this.showModal = true;
return Observable.create(observer => {
this.confirm.subscribe(r => {
this.showModal = false;
this.needsAuthentication = !r;
observer.next(r);
observer.complete();
});
});
}
else {
return Observable.of(true);
}
}
}

我这里有一个完整的实例。

http://plnkr.co/edit/C129guNJvri5hbGZGsHp?open=app%2Fapp.component.ts&p=preview

关于Angular2 - 如何最好地处理过期的身份验证 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40428184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com