【问题标题】:Using AWS Cognito in a Lambda function with npm在带有 npm 的 Lambda 函数中使用 AWS Cognito
【发布时间】:2020-01-09 05:17:03
【问题描述】:

我正在尝试在 Lambda 函数中使用 AWS Cognito 来授权用户。

我有一些来自 Udemy 课程的示例代码(不再可用):https://www.udemy.com/minimum-viable-aws-cognito-user-auth-in-javascript

代码使用脚本文件:

aws-cognito-sdk.min.js amazon-cognito-identity.min.js

npm 似乎可以使用第二个:amazon-cognito-identity-js

第一个文件应该是 aws-sdk 的精简版,仅包含 Cognito api 组件。完整的 aws-sdk 可从 npm 获得:aws-sdk 但我在 npm 中找不到缩减版。

缩减文件:aws-cognito-sdk.min.js 在 npm 中可用吗?

编辑: 根据 Russell 的说法,我应该使用 aws-sdk 包。

如果我有代码:

const AWS = require('aws-sdk');

var authenticationDetails = new AWS.AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);

我得到错误:

无法读取未定义的属性“CognitoIdentityServiceProvider”

AuthenticationDetails 的正确路径是什么?

【问题讨论】:

  • 我说 cognito 身份包依赖于它(这意味着 npm 也会下载该包)。你不需要它,你可以简单地使用 import 语句。
  • 能否请您发布 Udemy 课程中的相关代码,以使您的问题更加完整和有用。 Udemy 课程不再可用,因此对于某人来说不是一个可能的资源。

标签: node.js amazon-web-services npm aws-lambda amazon-cognito


【解决方案1】:

对于 Lambda,请使用 aws-sdk 模块:

const { CognitoIdentityServiceProvider } = require('aws-sdk')
//or 
const CognitoIdentityServiceProvider = require('aws-sdk/clients/cognitoidentityserviceprovider') // Much smaller size

对于身份验证,请使用AdminInitiateAuth 方法。

  const cognitoProvider =  new CognitoIdentityServiceProvider({
      apiVersion: '2016-04-18',
      accessKeyId:...
      secretAccessKey: ...
      region:...
    })

    await cognitoProvider.adminInitiateAuth(...)

amazon-cognito-identity-js 包适用于前端客户端(React、React Native 等)。它仅包含连接到 Cognito 所需的功能。它不需要aws-sdk 模块(除非您需要额外的功能)。

虽然您可以将amazon-cognito-identity-js 用于您的用例,但这远非理想,因为与使用您的 api 密钥加载管理方法相比,您只是假装是功能有限的未经身份验证的用户,从而为您提供了很多更多功能。

【讨论】:

  • 这比标记答案更好
【解决方案2】:

搞定了。

package.json 需要依赖:

"amazon-cognito-identity-js": "^1.31.0",
"aws-sdk": "^2.182.0",

AWS Lambda 不使用 Javascript ES6,因此您不能使用“import”关键字。

        const AWS = require('aws-sdk');

        var AmazonCognitoIdentity = require('amazon-cognito-identity-js');
        var CognitoUserPool = AmazonCognitoIdentity.CognitoUserPool;
        var AuthenticationDetails = AmazonCognitoIdentity.AuthenticationDetails;
        var CognitoUser = AmazonCognitoIdentity.CognitoUser;

        var poolData = {
            UserPoolId: 'THE USER POOL ID',
            ClientId: 'THE CLIENT ID'
        };
        var userPool = new CognitoUserPool(poolData);

        AWS.config.region = 'AWS_REGION';
        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: 'THE USERPOOL ID',
        });
        var email = "someone@somewhere.com";
        var password = "password";

        var authenticationData = {
            Username: email,
            Password: password
        };
        var authenticationDetails = new AuthenticationDetails(authenticationData);

        var userData = {
            Username: email,
            Pool: userPool
        };

        var cognitoUser = new CognitoUser(userData);

        console.log(result);
        cognitoUser.authenticateUser(authenticationDetails, {
            onSuccess: function (result) {
              console.log('access token + ' + result.getAccessToken().getJwtToken());
              callback(null, result);
            },

            onFailure: function (err) {
              console.log('Login error: ' + err);
              callback(null, result);
            }
        });

【讨论】:

  • AmazonCognitoIdentity 不附带const AWS = require('aws-sdk') 吗?
【解决方案3】:

我相信您在这里指的是 amazon-cognito-identity-js npm 包: https://www.npmjs.com/package/amazon-cognito-identity-js

NPM 包包含这两个文件。

该软件包包括 cognito SDK 调用 (aws-cognito-sdk)。它还依赖于核心 AWS SDK。

【讨论】:

猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2020-07-04
  • 2017-06-03
  • 2020-12-12
  • 2018-10-15
  • 1970-01-01
相关资源
最近更新 更多