【问题标题】:Passing userId from angular using cognito user pool to aws lambda使用 cognito 用户池将用户 ID 从 Angular 传递到 aws lambda
【发布时间】:2021-01-22 11:44:21
【问题描述】:

我有一个有角度的前端运输表单,当我单击提交时,值会到达后端,但不会到达 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) 时身份未定义。

我还在上面的角度服务中做了一个 console.log(session) 来验证 user_id 是否存在

我对为什么 userId 在输出中显示为空白字符串 userId: '' 感到非常困惑。感谢您的帮助!

【问题讨论】:

    标签: angular amazon-web-services aws-lambda amazon-cognito api-gateway


    【解决方案1】:

    你可以通过以下方式得到你想要的:

    context.identity.cognitoIdentityId
    

    【讨论】:

    • 我将映射模板中的userId更改为$context.identity.cognitoIdentityIdpostimg.cc/sBPSsG0D并在api网关中重新部署了API,但我仍然得到一个空白值返回postimg.cc/0KKy5L2d
    • 如果你在 lambda 中执行 console.log(context),你会得到什么?
    • 并且您启用了“集成响应”选项卡上的“使用调用方凭据调用”复选框?
    • 我没有选中它,如果我尝试启用它,当我将鼠标悬停在复选框上时,我会看到一个带有线条的红色圆圈,所以它不会让我这样做。我没有意识到这是一个要求。我有一个没有启用的工作示例,所以我不确定该选项是否必要,但我不是专家
    • 在 console.log(context) 图像中,您会注意到身份未定义 postimg.cc/WFHVhDgr 。我还在 Angular 服务中做了一个 console.log(session) (也从问题更新了代码)来验证 user_id 是否存在,它是 postimg.cc/cgKjkFtg
    【解决方案2】:

    有几件事是问题所在。我解决了这个问题

    1. 为我的用户池 userId 更改我的集成请求映射模板 userId 值 "userId": "$context.authorizer.claims.sub"
    2. 我为完全解决该问题所做的另一件事是将我创建的授权方添加到方法请求中。

    进行这些更改后,我能够成功地将数据存储到 dynamodb 中。

    【讨论】:

      猜你喜欢
      • 2018-12-11
      • 1970-01-01
      • 2018-07-02
      • 2020-01-27
      • 2020-02-25
      • 2018-09-08
      • 2018-08-23
      • 1970-01-01
      • 2019-11-29
      相关资源
      最近更新 更多