首页 > 解决方案 > 无服务器警告:有响应时没有 principalId

问题描述

尝试将serverless-local-authorizers-plugin集成到使用 AWS Lambda Authorizer 的系统中。当我打印响应时,它确实包含 aprincipalId并且我在一个对象中返回它,就像在线 lambda 响应一样。为什么我收到错误的任何想法

Serverless: Warning: No principalId in response?

它是如何返回的:

{
  "principalId":"user",
  "policyDocument":{
    "Version":"2012-10-17",
    "Statement":[{
      "Action":"execute-api:Invoke",
      "Effect":"Deny",
      "Resource":"arn:aws:execute-api:eu-central-1:my-AWS-ID:*"}
    ]},
   "context":{
      "platformRoles":"Guest",
      "userId":"unknown"
   }
}

本地认证代理功能

const AWS = require('aws-sdk');
const mylocalAuthProxyFn = async (event, context) => {
  const lambda = new AWS.Lambda();
  const req = {
    FunctionName: 'my-lambda-function-name',
    InvocationType: 'RequestResponse',
    Payload: JSON.stringify(event)
  };
  const results = await lambda.invoke(req).promise();
  if (results.StatusCode === 200) {
    return results.Payload;
  }
  throw new Error('Unauthorized');
};

module.exports = { mylocalAuthProxyFn };

标签: aws-lambdalocalserverlessaws-serverlesslambda-authorizer

解决方案


这是我弄清楚的作品。在与图书馆所有者交谈后,出于某种原因,在我的情况下,响应必须是一个明确的对象。他们声称您可以发送 promise 的 references 变量,但它对我不起作用。但以下是:

const AWS = require('aws-sdk');
const mylocalAuthProxyFn = async (event, context) => {
  const lambda = new AWS.Lambda();
  const req = {
    FunctionName: 'aidonic-endpoints-dev-createAuthorization',
    InvocationType: 'RequestResponse',
    Payload: JSON.stringify(event)
  };
  const result = await lambda.invoke(req).promise();
  if (result.StatusCode === 200) {
    const pl = JSON.parse(result.Payload);
    return {
      principalId: pl.principalId,
      policyDocument: {
        Version: '2012-10-17',
        Statement: [
          {
            Action: 'execute-api:Invoke',
            Effect: 'Allow',
            Resource: '*'
          }
        ]
      },
      context: {
        platformRoles: 'Verified Organization Representative,Registered User',
        userId: '23e8320fcechi042389h02ijwqwd'
      }
    };
  }
  throw new Error('Unauthorized');
};

module.exports = { mylocalAuthProxyFn };

推荐阅读