AWS-如何从NodeJs Lamda中的令牌获取用户名?

时间:2019-05-21 15:01:58

标签: node.js aws-lambda amazon-cognito

我在API网关之后使用NodeJs Lambda。

var AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18'})
exports.handler = async (event) => {
  const token = ...;
  const username = ...;
  const response = {
    "username": "...",
    firstname: "...",
    name: "...",
    email: "...",
    groups: []
  };
  return response;
};

我添加了一个认知授权者。使用令牌,结果可以,但没有结果为403。对我来说还可以。

例如:

https://123456789.execute-api.eu-west-1.amazonaws.com/v1/user/me

返回:

{
    "username": "foobar",
    "firstname": "foo",
    "name": "bar",
    "email": "foobar@gmail.com",
    "roles": [
        "Admin"
    ]
}

*如果foobar在JWT中,则使用foobar;如果toto在JWT中,则返回toto

现在,我想返回用户的用户名(来自JWT)。我的活动是空的:

"event": {},

2 个答案:

答案 0 :(得分:0)

我认为return并没有达到您的期望。尝试使用callback。详细信息here

  

Node.js运行时支持可选的回调参数。您可以使用   它可以明确地将信息返回给调用者。

     

回调(错误错误,对象结果);这两个参数都是可选的。   error是一个可选参数,可用于提供以下结果   Lambda函数执行失败。 Lambda函数成功执行后,   您可以将null作为第一个参数。

     

result是一个可选参数,可用于提供结果   函数成功执行的时间。提供的结果必须是   JSON.stringify兼容。如果提供错误,则此参数为   忽略。

     

如果您未在代码中使用回调,则AWS Lambda将调用它   隐式地,返回值为null。当回调被调用时,   AWS Lambda继续Lambda函数调用,直到事件发生   循环为空。

var AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18'})
exports.handler = function(event, context, callback) => {
  const token = ...;
  const username = ...;
  const response = {
    "username": "...",
    firstname: "...",
    name: "...",
    email: "...",
    groups: []
  };
  callback(null, response);
};

答案 1 :(得分:0)

 const claims = event.requestContext.authorizer.claims;
 const username = claims['cognito:username'];

在使用此功能之前,我需要使用proxyLambda

enter image description here

并将其添加到CORS(CORB)中:

   const response = {
     statusCode: 200,
     headers: {
       "Access-Control-Allow-Origin": "*"
     },
     body: JSON.stringify(r)
  };
  return response;

或其他解决方案:我不使用proxyLamba,但您可以配置以下内容: enter image description here

之后,您需要在Lambda中解码JWT。

const jwtToken = event.params.header.Authorization;