在Angular拦截器中使用放大凭证

时间:2018-09-27 18:53:46

标签: angular rxjs aws-amplify

我们正在使用Amplify对AWS Lambda进行身份验证。我们正在尝试为我们的产品增加安全性,因此我添加了一个拦截器来检索当前凭证并将其添加到每个请求的标头中。

下面的代码正确拦截请求,并正确检索访问令牌。但是,由于所有运动部件都是由异步Promise / Observable驱动的,因此请求在添加标头之前就消失了。我需要更改什么?

对于在Promise / Observable中的有限经验,我深表歉意。

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    console.log("INTERCEPTED!!");
    this.auth.userCredentials().subscribe( result => {
        this.sessionToken = result.sessionToken;
        console.log(this.sessionToken);
        request = request.clone({
            withCredentials : true,
            setHeaders: {
                Authorization: `Bearer ${this.sessionToken}`
            }            
        });
    });
    console.log(request);
    return next.handle(request);
}

2 个答案:

答案 0 :(得分:0)

这似乎很好。有三个问题。 1)我需要设置withCredentials = false。 2)我需要从订阅中返回next.handle。 3)用户凭证中的会话令牌是错误的令牌,Cognito希望使用session.idToken.jwtToken。

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    this.auth.session().subscribe( 
        result => {
            this.sessionToken = result.idToken.jwtToken;
            request = request.clone({
                withCredentials : false,
                setHeaders: {
                    Authorization: `Bearer ${this.sessionToken}`
                }            
            });    
            return next.handle(request);
        });
    return next.handle(request);
}

答案 1 :(得分:0)

import { Auth } from 'aws-amplify';
....

async getToken(){
   return (await Auth.currentSession()).getAccessToken().getJwtToken()
  }