缺少 Headers aws-amplify + angular 5.x
Missing Headers aws-amplify + angular 5.x
我正在使用 angular 5.x and aws-amplify. I successfully managed to sign-up, confirm and sign-in my users via aws-cognito and now, I would like to retrieve user's jwt
to add it at requests header to perform CRUD operations on my dynamoDb collection.
构建项目
不幸的是,当我尝试在 dynamo 上执行此类操作时,出现以下错误:
{
"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"
}
我使用以下方法获取用户的令牌 Cognito.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
}
)
})
其中 Dynamo.service 如下:
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
}
)
);
}
}
我的环境如下:
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);
...
在我的 api-gatway 上,我启用了标准 CORS
、Authorization
必需且没有 Token
验证。
我觉得我做的一切都很好,我不明白我做错了什么。
编辑:
Authorization
header 在使用 API.get(...)
并传递给它一个 header object 时得到正确设置,例如:
{
Authorization: 'myToken'
}
更多可以在下面阅读 link aws.github.io/aws-amplify
有什么建议吗?
我不明白你的问题,所以我会依赖你的问题标题。
如果缺少 header,那是因为 Angular 在给您回复之前简化了 header。
如果你想获取 header 并将其放入你的请求中,你将不得不公开它。
这是通过 Access Control Expose Headers header.
完成的
默认情况下,Angular 只处理几个 header 并删除其他的。你可能没有得到你的令牌,因为它在一个非公开的 header 中。
我设法找出了导致问题的原因。该错误不是由 headers 或代码引起的,而是由调用的路由引起的。在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"
}
我认为这通常是由 headers 引起的。对于那些遇到同样问题的人:
- 确保您呼叫的路线正确
- 确保您使用的不是
AWS_IAM
授权,而是来自您的 cognito user pool
- 确保获取当前
jwt
并将其传递给所有 API
请求,就像我在上面的代码中显示的那样。
我正在使用 angular 5.x and aws-amplify. I successfully managed to sign-up, confirm and sign-in my users via aws-cognito and now, I would like to retrieve user's jwt
to add it at requests header to perform CRUD operations on my dynamoDb collection.
不幸的是,当我尝试在 dynamo 上执行此类操作时,出现以下错误:
{
"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"
}
我使用以下方法获取用户的令牌 Cognito.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
}
)
})
其中 Dynamo.service 如下:
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
}
)
);
}
}
我的环境如下:
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);
...
在我的 api-gatway 上,我启用了标准 CORS
、Authorization
必需且没有 Token
验证。
我觉得我做的一切都很好,我不明白我做错了什么。
编辑:
Authorization
header 在使用 API.get(...)
并传递给它一个 header object 时得到正确设置,例如:
{
Authorization: 'myToken'
}
更多可以在下面阅读 link aws.github.io/aws-amplify
有什么建议吗?
我不明白你的问题,所以我会依赖你的问题标题。
如果缺少 header,那是因为 Angular 在给您回复之前简化了 header。
如果你想获取 header 并将其放入你的请求中,你将不得不公开它。
这是通过 Access Control Expose Headers header.
完成的默认情况下,Angular 只处理几个 header 并删除其他的。你可能没有得到你的令牌,因为它在一个非公开的 header 中。
我设法找出了导致问题的原因。该错误不是由 headers 或代码引起的,而是由调用的路由引起的。在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"
}
我认为这通常是由 headers 引起的。对于那些遇到同样问题的人:
- 确保您呼叫的路线正确
- 确保您使用的不是
AWS_IAM
授权,而是来自您的cognito user pool
- 确保获取当前
jwt
并将其传递给所有API
请求,就像我在上面的代码中显示的那样。