控制对的访问 API 网关 APIs - AWS Serverless Application Model
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

控制对的访问 API 网关 APIs

您可以使用 AWS SAM 控制谁可以访问您的 API 网关 APIs 在你的 AWS SAM 模板。

AWS SAM 支持多种机制来控制对 API 网关 APIs:

  • Lambda 授权者. 甲 Lambda 授权者(以前称为 自定义授权人)是 Lambda 功能,以控制对API的访问。当调用您的API时, Lambda 用由客户端应用程序提供的请求上下文或授权令牌调用函数。的 Lambda 函数返回策略文档,该文档指定了主叫者有权执行的操作(如果有)。有关 Lambda 授权者,请参阅 使用 API 网关 Lambda 授权者API 网关 开发人员指南. 例如 Lambda 授权者,请参阅 示例:定义 Lambda 代币授权商示例:定义 Lambda 请求授权人 本主题的后面部分。

     

  • Amazon Cognito 用户池。 Amazon Cognito 用户池是中的用户目录 Amazon Cognito. 您的API的客户端必须首先将用户登录到用户池,并获得用户的身份或访问令牌。然后,将使用其中一个返回的令牌调用您的API。仅当所需的令牌有效时,API调用才会成功。有关 Amazon Cognito 用户池,请参阅 使用控制对RESTAPI的访问 Amazon Cognito 用户池 作为授权方API 网关 开发人员指南. 例如, Amazon Cognito 用户池,请参阅 示例:定义 Amazon Cognito 用户池 本主题的后面部分。

     

  • IAM 权限. 您可以使用控制谁可以调用您的API IAM 权限. 调用您的API的用户必须使用进行身份验证 IAM 凭证。只有当有 IAM 政策 IAM 表示API调用方的用户, IAM 包含用户的组,或 IAM 用户承担的角色。有关 IAM 权限,请参阅 通过控制对API的访问 IAM 权限API 网关 开发人员指南. 例如, IAM 权限,请参阅 示例:定义 IAM 权限 本主题的后面部分。

     

  • API密钥. API 密钥 是字母数字字符串值,可将它分发给应用程序开发人员(要向其授予对您的 API 的访问权的客户)。有关API密钥的更多信息,请参阅 使用API密钥创建和使用计划API 网关 开发人员指南. 有关API密钥的示例,请参阅 示例:定义API密钥 本主题的后面部分。

     

  • 资源政策. 资源策略是JSON策略文档,您可以将其附加到 API 网关 API控制指定的主体(通常为 IAM 用户或角色)可以调用API。有关资源策略的更多信息,请参阅 通过控制对API的访问 Amazon API Gateway 资源政策API 网关 开发人员指南. 有关资源策略的示例,请参阅 示例:定义资源策略 本主题的后面部分。

此外,您还可以使用 AWS SAM 定制部分 API 网关 错误响应。有关自定义的更多信息 API 网关 错误响应,请参阅 设置网关响应以自定义错误响应. 有关自定义响应的示例,请参阅 示例:定义自定义响应 本主题的后面部分。

选择控制访问的机制

您选择控制访问您的的机制 API 网关 APIs 取决于几个因素。例如,如果您有一个尚未设置授权或访问控制的新建项目,则 Amazon Cognito 用户池可能是您的最佳选项。这是因为当您设置用户池时,您还会自动设置身份验证和访问控制。

但是,如果您的应用程序已经设置了身份验证,则使用 Lambda 授权者可能是最佳选项。这是因为您可以调用现有的身份验证服务,并根据响应返回策略文档。此外,如果您的应用程序需要用户池不支持的自定义身份验证或访问控制逻辑,则 Lambda 授权者可能是您的最佳选择。

决定使用哪种机制后,请参阅本主题的相应部分,了解如何使用 AWS SAM 配置您的应用程序以使用该机制。

示例:定义 Lambda 代币授权商

您可以控制对您的的访问 APIs 通过定义 Lambda 令牌授权者 AWS SAM 模板。为此,您可以使用 ApiAuth 数据类型。

以下是一个示例 AWS SAM 模板部分 Lambda 令牌授权人:

Resources: MyApi: Type: AWS::Serverless::Api Properties: StageName: Prod Auth: DefaultAuthorizer: MyLambdaTokenAuthorizer Authorizers: MyLambdaTokenAuthorizer: FunctionArn: !GetAtt MyAuthFunction.Arn MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src Handler: index.handler Runtime: nodejs12.x Events: GetRoot: Type: Api Properties: RestApiId: !Ref MyApi Path: / Method: get MyAuthFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src Handler: authorizer.handler Runtime: nodejs12.x

有关 API 网关 Lambda 授权者,请参阅 使用 API 网关 Lambda 授权者API 网关 开发人员指南.

示例:定义 Lambda 请求授权人

您可以控制对您的的访问 APIs 通过定义 Lambda 在您的 AWS SAM 模板。为此,您可以使用 ApiAuth 数据类型。

以下是一个示例 AWS SAM 模板部分 Lambda 请求授权人:

Resources: MyApi: Type: AWS::Serverless::Api Properties: StageName: Prod Auth: DefaultAuthorizer: MyLambdaRequestAuthorizer Authorizers: MyLambdaRequestAuthorizer: FunctionPayloadType: REQUEST FunctionArn: !GetAtt MyAuthFunction.Arn Identity: QueryStrings: - auth MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src Handler: index.handler Runtime: nodejs12.x Events: GetRoot: Type: Api Properties: RestApiId: !Ref MyApi Path: / Method: get MyAuthFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src Handler: authorizer.handler Runtime: nodejs12.x

有关 API 网关 Lambda 授权者,请参阅 使用 API 网关 Lambda 授权者API 网关 开发人员指南.

示例:定义 Amazon Cognito 用户池

您可以控制对您的的访问 APIs 通过定义 Amazon Cognito 位于您的 AWS SAM 模板。为此,您可以使用 ApiAuth 数据类型。

以下是一个示例 AWS SAM 用户池的模板部分:

Resources: MyApi: Type: AWS::Serverless::Api Properties: StageName: Prod Cors: "'*'" Auth: DefaultAuthorizer: MyCognitoAuthorizer Authorizers: MyCognitoAuthorizer: UserPoolArn: !GetAtt MyCognitoUserPool.Arn MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src Handler: lambda.handler Runtime: nodejs12.x Events: Root: Type: Api Properties: RestApiId: !Ref MyApi Path: / Method: GET MyCognitoUserPool: Type: AWS::Cognito::UserPool Properties: UserPoolName: !Ref CognitoUserPoolName Policies: PasswordPolicy: MinimumLength: 8 UsernameAttributes: - email Schema: - AttributeDataType: String Name: email Required: false MyCognitoUserPoolClient: Type: AWS::Cognito::UserPoolClient Properties: UserPoolId: !Ref MyCognitoUserPool ClientName: !Ref CognitoUserPoolClientName GenerateSecret: false

有关 Amazon Cognito 用户池,请参阅 使用控制对RESTAPI的访问 Amazon Cognito 用户池 作为授权方 API 网关 开发人员指南.

示例:定义 IAM 权限

您可以控制对您的的访问 APIs 通过定义 IAM 权限 AWS SAM 模板。为此,您可以使用 ApiAuth 数据类型。

以下是一个示例 AWS SAM 模板部分 IAM 权限:

Resources: MyApi: Type: AWS::Serverless::Api Properties: StageName: Prod Auth: DefaultAuthorizer: AWS_IAM MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: . Handler: index.handler Runtime: nodejs12.x Events: GetRoot: Type: Api Properties: RestApiId: !Ref MyApi Path: / Method: get

有关 IAM 权限,请参阅 使用控制对API的访问 IAM 权限API 网关 开发人员指南.

示例:定义API密钥

您可以控制对您的的访问 APIs 通过在您的 AWS SAM 模板。为此,您可以使用 ApiAuth 数据类型。

以下是一个示例 AWS SAM API密钥的模板部分:

Resources: MyApi: Type: AWS::Serverless::Api Properties: StageName: Prod Auth: ApiKeyRequired: true # sets for all methods MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: . Handler: index.handler Runtime: nodejs12.x Events: ApiKey: Type: Api Properties: RestApiId: !Ref MyApi Path: / Method: get Auth: ApiKeyRequired: true

有关API密钥的更多信息,请参阅 使用API密钥创建和使用计划API 网关 开发人员指南.

示例:定义资源策略

您可以控制对您的的访问 APIs 在 AWS SAM 模板。为此,您可以使用 ApiAuth 数据类型。

以下是一个示例 AWS SAM 资源策略的模板部分:

Resources: ExplicitApi: Type: AWS::Serverless::Api Properties: StageName: Prod EndpointConfiguration: PRIVATE Auth: ResourcePolicy: CustomStatements: { Effect: 'Allow', Action: 'execute-api:Invoke', Resource: ['execute-api:/*/*/*'], Principal: '*' } MinimalFunction: Type: 'AWS::Serverless::Function' Properties: CodeUri: s3://sam-demo-bucket/hello.zip Handler: hello.handler Runtime: python2.7 Events: AddItem: Type: Api Properties: RestApiId: Ref: ExplicitApi Path: /add Method: post

有关资源策略的更多信息,请参阅 通过控制对API的访问 Amazon API Gateway 资源政策API 网关 开发人员指南.

示例:定义自定义响应

您可以自定义一些 API 网关 错误响应,方法是在 AWS SAM 模板。为此,您可以使用 网关响应对象 数据类型。

以下是一个示例 AWS SAM 模板部分 API 网关 回答:

Resources: MyApi: Type: AWS::Serverless::Api Properties: StageName: Prod GatewayResponses: DEFAULT_4xx: ResponseParameters: Headers: Access-Control-Expose-Headers: "'WWW-Authenticate'" Access-Control-Allow-Origin: "'*'" GetFunction: Type: AWS::Serverless::Function Properties: Handler: index.get Runtime: nodejs12.x InlineCode: module.exports = async () => throw new Error('Check out the response headers!') Events: GetResource: Type: Api Properties: Path: /error Method: get RestApiId: !Ref MyApi

有关自定义的更多信息 API 网关 消息, 参见 设置网关响应以自定义错误响应API 网关 开发人员指南.