使用 cognito 用户池将 userId 从 angular 传递到 aws lambda
Passing userId from angular using cognito user pool to aws lambda
我有一个 angular 前端运输表单,当我点击提交时,值到达后端,但不是 userId。我的应用程序使用 cognito 用户池进行身份验证,我获得了令牌。
但我似乎无法传递 userId。
我根据 documentation 添加了 $context.authorizer.principalId
。我也试过 $context.authorizer.claims.userId
但同样的问题。
shipping.service.ts
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Http, Headers, Response } from '@angular/http';
import { Subject, BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators';
import { AuthService } from '../../auth.service';
@Injectable()
export class ShippingService {
dataEdited = new BehaviorSubject<boolean>(false);
dataIsLoading = new BehaviorSubject<boolean>(false);
dataLoaded = new Subject<[]>();
dataLoadFailed = new Subject<boolean>();
userData;
constructor(private http: HttpClient, private authService: AuthService) {
}
onStoreData(data) {
this.dataLoadFailed.next(false);
this.dataIsLoading.next(true);
this.dataEdited.next(false);
this.userData = data;
console.log("DATA", data)
this.authService.getAuthenticatedUser().getSession((err, session) => {
console.log(session);
let headers = new HttpHeaders();
headers.append('Authorization', session.getIdToken().getJwtToken());
headers.append('Accept', 'application/json');
headers.append('Access-Control-Allow-Origin', '*');
let options = { headers: headers, reportProgress: true };
if (err) {
return;
}
this.http.post('https://nx96w6r3oc.execute-api.us-east-1.amazonaws.com/dev/shipping', data, options)
.subscribe(
(result) => {
this.dataLoadFailed.next(false);
this.dataIsLoading.next(false);
this.dataEdited.next(true);
},
(error) => {
this.dataIsLoading.next(false);
this.dataLoadFailed.next(true);
this.dataEdited.next(false);
}
);
});
}
}
aws lambda 函数
const AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = (event, context, callback) => {
console.log(event)
const params = {
Item:{
"UserId": {
S: event.userId
},
"FirstName": {
S: event.firstName
},
"LastName": {
S: event.lastName
},
"Address1": {
S: event.address1
},
"Address2": {
S: event.address1
},
"State": {
S: event.state
},
"City": {
S: event.city
},
"Zip": {
S: event.zip
}
},
TableName: "shipping"
};
dynamodb.putItem(params, function(err, data) {
if (err) {
console.log(err)
callback(err);
}
else{
console.log(data)
callback(null, data);
}
});
};
更新:
到目前为止我注意到的几件事是在 lambda 函数中输出 console.log(context)
时身份未定义。
我还在上面的 angular 服务中做了一个 console.log(session) 来验证 user_id 是否存在
我非常困惑为什么 userId 在输出中显示为空白字符串 userId: ''
。感谢您的帮助!
您可以通过以下方式获得您想要的:
context.identity.cognitoIdentityId
有几件事是问题所在。我通过
解决了问题
- 为我的用户池 userId
更改我的集成请求映射模板 userId 值 "userId": "$context.authorizer.claims.sub"
- 我为完全解决它所做的另一件事是将我创建的授权方添加到方法请求中。
进行这些更改后,我能够成功地将数据存储到 dynamodb 中。
我有一个 angular 前端运输表单,当我点击提交时,值到达后端,但不是 userId。我的应用程序使用 cognito 用户池进行身份验证,我获得了令牌。
但我似乎无法传递 userId。
我根据 documentation 添加了 $context.authorizer.principalId
。我也试过 $context.authorizer.claims.userId
但同样的问题。
shipping.service.ts
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Http, Headers, Response } from '@angular/http';
import { Subject, BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators';
import { AuthService } from '../../auth.service';
@Injectable()
export class ShippingService {
dataEdited = new BehaviorSubject<boolean>(false);
dataIsLoading = new BehaviorSubject<boolean>(false);
dataLoaded = new Subject<[]>();
dataLoadFailed = new Subject<boolean>();
userData;
constructor(private http: HttpClient, private authService: AuthService) {
}
onStoreData(data) {
this.dataLoadFailed.next(false);
this.dataIsLoading.next(true);
this.dataEdited.next(false);
this.userData = data;
console.log("DATA", data)
this.authService.getAuthenticatedUser().getSession((err, session) => {
console.log(session);
let headers = new HttpHeaders();
headers.append('Authorization', session.getIdToken().getJwtToken());
headers.append('Accept', 'application/json');
headers.append('Access-Control-Allow-Origin', '*');
let options = { headers: headers, reportProgress: true };
if (err) {
return;
}
this.http.post('https://nx96w6r3oc.execute-api.us-east-1.amazonaws.com/dev/shipping', data, options)
.subscribe(
(result) => {
this.dataLoadFailed.next(false);
this.dataIsLoading.next(false);
this.dataEdited.next(true);
},
(error) => {
this.dataIsLoading.next(false);
this.dataLoadFailed.next(true);
this.dataEdited.next(false);
}
);
});
}
}
aws lambda 函数
const AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = (event, context, callback) => {
console.log(event)
const params = {
Item:{
"UserId": {
S: event.userId
},
"FirstName": {
S: event.firstName
},
"LastName": {
S: event.lastName
},
"Address1": {
S: event.address1
},
"Address2": {
S: event.address1
},
"State": {
S: event.state
},
"City": {
S: event.city
},
"Zip": {
S: event.zip
}
},
TableName: "shipping"
};
dynamodb.putItem(params, function(err, data) {
if (err) {
console.log(err)
callback(err);
}
else{
console.log(data)
callback(null, data);
}
});
};
更新:
到目前为止我注意到的几件事是在 lambda 函数中输出 console.log(context)
时身份未定义。
我还在上面的 angular 服务中做了一个 console.log(session) 来验证 user_id 是否存在
我非常困惑为什么 userId 在输出中显示为空白字符串 userId: ''
。感谢您的帮助!
您可以通过以下方式获得您想要的:
context.identity.cognitoIdentityId
有几件事是问题所在。我通过
解决了问题- 为我的用户池 userId 更改我的集成请求映射模板 userId 值
- 我为完全解决它所做的另一件事是将我创建的授权方添加到方法请求中。
"userId": "$context.authorizer.claims.sub"
进行这些更改后,我能够成功地将数据存储到 dynamodb 中。