丢失的标题aws-amplify + angular 5.x.

时间:2018-03-20 09:28:10

标签: angular amazon-web-services amazon-dynamodb amazon-cognito aws-amplify

我正在使用angular 5.xaws-amplify构建项目。我成功设法通过aws-cognito注册,确认并登录我的用户,现在,我想检索用户的1,将其添加到请求标头,以便对我的{{3}执行CRUD操作收集。

不幸的是,当我尝试在发电机上执行此类操作时,我收到以下错误:

companies

我使用以下 Cognito.service

获取用户的令牌
jwt

得到的是:

{
    "message": "Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header. Authorization=xxxxx"
}

Dynamo.service 的位置如下:

import { Injectable } from '@angular/core';

/** rxjs **/
import { fromPromise } from 'rxjs/observable/fromPromise';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';

/** 3rd party **/
import { Auth } from 'aws-amplify';

@Injectable()
export class CognitoService {

    getJwtToken(): Observable<any> {
        return this.getCurrentSession()
            .switchMap((token) => {
                return of(token.getIdToken().getJwtToken());
            })
    }

    private getCurrentSession(): Observable<any> {
        return fromPromise(Auth.currentSession());
    }

}

我的环境如下:

this.cognitoService.getJwtToken()
    .subscribe((token: string) => {
        this.dynamoService.get(
            'testResource?id=someValue',
            {
                Authorization: token
            }
         )
    })

当然,在我的应用程序启动时,我正在配置放大像:

import { Injectable } from '@angular/core';

/** rxjs **/
import { fromPromise } from 'rxjs/observable/fromPromise';
import { Observable } from 'rxjs/Observable';

/** 3rd party **/
import { API } from 'aws-amplify';

/** App Environment **/
import { environment } from '../../../environments/environment';

@Injectable()
export class DynamoDBService {

    apiName = environment.amplify.API.endpoints[0].name;

    get(path: string, headers: any): Observable<any> {
        return fromPromise(
            API.get(
                this.apiName,
                path,
                {
                    headers: headers
                }
            )
        );
    }
}

dynamoDb我已启用标准export const environment = { production: false, amplify: { Auth: { region: 'eu-central-1', identityPoolId: 'eu-central-1:xxx', userPoolId: 'eu-central-1_xxx', userPoolWebClientId: 'xxxx' }, API: { endpoints: [ { name: "someName, endpoint: "xxxxx" } ] } } }; ... /** App Environment **/ import { environment } from '../../environments/environment'; ... Amplify.configure(environment.amplify); ... 必需且无CORS验证。 我觉得我做的一切都很好,我不知道我做错了什么。

修改

使用Authorization并向其传递标题对象时,

Token标头已正确设置:

Authorization

可以通过以下链接api-gatway

阅读更多内容

有任何建议吗?

2 个答案:

答案 0 :(得分:1)

我没有得到你的问题,所以我会依赖你问题的标题。

如果缺少标头,那是因为Angular在给出响应之前简化了标头。

如果您想获取标题并将其放入请求中,则必须公开它。

这是通过 Access Control Expose Headers 标题完成的。

默认情况下,Angular只处理几个标题并删除其他标题。您可能没有获得令牌,因为它位于非暴露的标头中。

答案 1 :(得分:0)

我设法找出导致问题的原因。错误不是由标题或代码引起的,而是由被调用的路由引起的。在api-gateway中,您可以定义资源和方法。

我有一个api-gateway结构,如:

/
----testResource/
    ----/{id}
        ---- GET

我打电话给testResource?id=someValue,这是错误的。通过id调用相同资源的正确方法是testResource/someValue

出于某种原因,网关,而不是给我一个感觉到的错误,给了我:

{
    "message": "Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header. Authorization=xxxxx"
}

我认为这是由标题引起的。对于那些在同样问题上挣扎的人:

  • 确保拨打正确的路线
  • 确保您没有使用AWS_IAM授权,但来自cognito user pool
  • 的授权
  • 请务必获取当前jwt并将其传递给您在上面的代码中显示的所有API个请求。