SAM Local 似乎不是 运行 授权方功能
SAM Local doesn't appear to be running Authorizer functions
我刚刚开始使用 SAM Local,但在尝试为我的端点配置授权函数时再次遇到问题。
我一直在查看 main SAM documentation 以了解如何设置 Auth 功能,但每当我尝试使用 sam local start-api
在本地 运行 API 时,它 运行 很好,但好像它甚至没有尝试 运行 身份验证功能。
我已经尝试在 Global.API 中定义 Auth,并在 SAM template.yaml[=26 的资源部分中定义 API 资源=]
# template.yaml
Globals:
Function:
Timeout: 3
CodeUri: src/
Runtime: nodejs8.10
Api:
Auth: # Option #1: Defining it globally
DefaultAuthorizer: CustomJWTAuthorizer
Authorizers:
CustomJWTAuthorizer:
FunctionArn: !GetAtt AuthFunction.Arn
Resources:
UserApi:
Auth: # Option #2: Defining it as an API resource
Authorizers:
MyLambdaTokenAuth:
FunctionPayloadType: TOKEN
FunctionArn: !GetAtt AuthFunction.Arn
DefaultAuthorizer: MyLambdaTokenAuth
GetUserFunction:
Type: AWS::Serverless::Function
Properties:
Handler: handler.getUser
Events:
GetUser:
Type: Api
Properties:
Path: /users/{userId}
Method: get
Auth: # Option #3: Define it on the function level
Authorizer: AuthFunction
RestApiId:
Ref: UserApi
AuthFunction:
Type: AWS::Serverless::Function
Properties:
Handler: handler.authorize
我已经尝试将事件打印到控制台,并且可以看到 event.requestContext
只是填充了虚拟数据,而不是在实时推送时传递给它:
// console.log(event)
...
resource: '/users/{userId}',
requestContext: { resourceId: '123456',
apiId: '1234567890',
resourcePath: '/users/{userId}',
httpMethod: 'GET',
requestId: 'c6af9ac6-7b61-11e6-9a41-93e8deadbeef',
accountId: '123456789012',
stage: null,
identity:
{ apiKey: null,
userArn: null,
cognitoAuthenticationType: null,
caller: null,
userAgent: 'Custom User Agent String',
user: null,
cognitoIdentityPoolId: null,
cognitoAuthenticationProvider: null,
sourceIp: '127.0.0.1',
accountId: null },
extendedRequestId: null,
path: '/users/{userId}' },
...
遗憾的是,当 运行 在本地编码时,AWS SAM CLI 尚不支持授权方。但是有一个开放的功能请求来增加对它的支持:https://github.com/awslabs/aws-sam-cli/issues/137.
当您 运行 在本地时,SAM 不支持自定义授权方(SAM 版本 0.48)。所以你不能用 "sam local start-api".
来测试它
但它支持 SAM YAML 模板,您可以使用 SAM CLI 构建自定义授权器并将其部署到您的 AWS 云 Api 网关。如果您的 YAML 设置正确,它可以很好地工作。
我刚刚开始使用 SAM Local,但在尝试为我的端点配置授权函数时再次遇到问题。
我一直在查看 main SAM documentation 以了解如何设置 Auth 功能,但每当我尝试使用 sam local start-api
在本地 运行 API 时,它 运行 很好,但好像它甚至没有尝试 运行 身份验证功能。
我已经尝试在 Global.API 中定义 Auth,并在 SAM template.yaml[=26 的资源部分中定义 API 资源=]
# template.yaml
Globals:
Function:
Timeout: 3
CodeUri: src/
Runtime: nodejs8.10
Api:
Auth: # Option #1: Defining it globally
DefaultAuthorizer: CustomJWTAuthorizer
Authorizers:
CustomJWTAuthorizer:
FunctionArn: !GetAtt AuthFunction.Arn
Resources:
UserApi:
Auth: # Option #2: Defining it as an API resource
Authorizers:
MyLambdaTokenAuth:
FunctionPayloadType: TOKEN
FunctionArn: !GetAtt AuthFunction.Arn
DefaultAuthorizer: MyLambdaTokenAuth
GetUserFunction:
Type: AWS::Serverless::Function
Properties:
Handler: handler.getUser
Events:
GetUser:
Type: Api
Properties:
Path: /users/{userId}
Method: get
Auth: # Option #3: Define it on the function level
Authorizer: AuthFunction
RestApiId:
Ref: UserApi
AuthFunction:
Type: AWS::Serverless::Function
Properties:
Handler: handler.authorize
我已经尝试将事件打印到控制台,并且可以看到 event.requestContext
只是填充了虚拟数据,而不是在实时推送时传递给它:
// console.log(event)
...
resource: '/users/{userId}',
requestContext: { resourceId: '123456',
apiId: '1234567890',
resourcePath: '/users/{userId}',
httpMethod: 'GET',
requestId: 'c6af9ac6-7b61-11e6-9a41-93e8deadbeef',
accountId: '123456789012',
stage: null,
identity:
{ apiKey: null,
userArn: null,
cognitoAuthenticationType: null,
caller: null,
userAgent: 'Custom User Agent String',
user: null,
cognitoIdentityPoolId: null,
cognitoAuthenticationProvider: null,
sourceIp: '127.0.0.1',
accountId: null },
extendedRequestId: null,
path: '/users/{userId}' },
...
遗憾的是,当 运行 在本地编码时,AWS SAM CLI 尚不支持授权方。但是有一个开放的功能请求来增加对它的支持:https://github.com/awslabs/aws-sam-cli/issues/137.
当您 运行 在本地时,SAM 不支持自定义授权方(SAM 版本 0.48)。所以你不能用 "sam local start-api".
来测试它但它支持 SAM YAML 模板,您可以使用 SAM CLI 构建自定义授权器并将其部署到您的 AWS 云 Api 网关。如果您的 YAML 设置正确,它可以很好地工作。