Amazon API Gateway
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

创建 Lambda REQUEST 授权方函数

WebSocket API 中的 Lambda 授权方函数类似于 REST API 的授权方函数,但有以下例外情况:

  • 您不能使用路径变量 (event.pathParameters),因为路径是固定的。

  • event.methodArn 与 REST API 等效变量不同,因为它没有 HTTP 方法。如果是 $connect,则 methodArn"$connect" 结尾:

    arn:aws:execute-api:region:account-id:api-id/stage-name/$connect
  • event.requestContext 中的上下文变量与 REST API 的上下文变量不同。

以下示例 Lambda 授权方函数是在 Lambda 控制台中创建 API Gateway Lambda 授权方函数中 REST API 的 Lambda 授权方函数的 WebSocket 版本:

exports.handler = function(event, context, callback) { console.log('Received event:', JSON.stringify(event, null, 2)); // A simple REQUEST authorizer example to demonstrate how to use request // parameters to allow or deny a request. In this example, a request is // authorized if the client-supplied HeaderAuth1 header, QueryString1 query parameter, // stage variable of StageVar1 and the accountId in the request context all match // specified values of 'headerValue1', 'queryValue1', 'stageValue1', and // '123456789012', respectively. // Retrieve request parameters from the Lambda function input: var headers = event.headers; var queryStringParameters = event.queryStringParameters; var stageVariables = event.stageVariables; var requestContext = event.requestContext; // Parse the input for the parameter values var tmp = event.methodArn.split(':'); var apiGatewayArnTmp = tmp[5].split('/'); var awsAccountId = tmp[4]; var region = tmp[3]; var restApiId = apiGatewayArnTmp[0]; var stage = apiGatewayArnTmp[1]; var route = apiGatewayArnTmp[2]; // Perform authorization to return the Allow policy for correct parameters and // the 'Unauthorized' error, otherwise. var authResponse = {}; var condition = {}; condition.IpAddress = {}; if (headers.HeaderAuth1 === "headerValue1" && queryStringParameters.QueryString1 === "queryValue1" && stageVariables.StageVar1 === "stageValue1" && requestContext.accountId === "123456789012") { callback(null, generateAllow('me', event.methodArn)); } else { callback("Unauthorized"); } } // Help function to generate an IAM policy var generatePolicy = function(principalId, effect, resource) { // Required output: var authResponse = {}; authResponse.principalId = principalId; if (effect && resource) { var policyDocument = {}; policyDocument.Version = '2012-10-17'; // default version policyDocument.Statement = []; var statementOne = {}; statementOne.Action = 'execute-api:Invoke'; // default action statementOne.Effect = effect; statementOne.Resource = resource; policyDocument.Statement[0] = statementOne; authResponse.policyDocument = policyDocument; } // Optional output with custom properties of the String, Number or Boolean type. authResponse.context = { "stringKey": "stringval", "numberKey": 123, "booleanKey": true }; return authResponse; } var generateAllow = function(principalId, resource) { return generatePolicy(principalId, 'Allow', resource); } var generateDeny = function(principalId, resource) { return generatePolicy(principalId, 'Deny', resource); }

要将前面的 Lambda 函数配置为 WebSocket API 的 REQUEST 授权方函数,请遵循与 REST API 相同的过程。

要将 $connect 路由配置为在控制台中使用此 Lambda 授权方,请选择或创建 $connect 路由。选择路由请求并在Authorization (授权) 下拉菜单中选择您的授权方。

要测试授权方,您将需要创建一个新连接。在 $connect 中更改授权方不会影响已连接的客户端。当连接到 WebSocket API 时,您将需要为任何已配置的身份源提供值。例如,您可以通过使用 wscat 发送有效的查询字符串和标头进行连接,如以下示例所示:

wscat -c 'wss://myapi.execute-api.us-east-1.amazonaws.com/beta?QueryAuth1=queryValue1' -H HeaderAuth1:headerValue1

如果您尝试在没有有效身份值的情况下进行连接,您将收到 401 响应:

wscat -c wss://myapi.execute-api.us-east-1.amazonaws.com/beta error: Unexpected server response: 401