我已在API网关中为代理资源配置了自定义授权,但我的要求是免除少量API授权,但我不想在API网关中配置新API,因为我正在尝试通过API设计代理API网关。
例如,API /server/ver1.0/rest/{proxy+},这是我在API网关中配置的REST API,它通过自定义授权程序然后如果成功则调用后端http服务。
但我想免除API - /server/ver1.0/rest/acc/reg授权。
答案 0 :(得分:2)
最后,我已经按照我在问题中描述的方式解决了这个问题,
由于AWS无法以任何编程方式省略特定条件,因此我们留下以下选项:
创建单独的API - 这样,AWS就会优先考虑
比通用的API更具体的API,即API
/server/ver1.0/rest/acc/reg
会优先考虑
/server/ver1.0/rest/{proxy+} 2)
修改自定义授权程序lambda 函数检查每个URL模式,但这使lambda 定制auth很复杂,维护性较差。
我采用了第一个选项,因为它更清洁,更易于维护,而且我不想用各种URL模式污染我的lambda自定义授权器
答案 1 :(得分:1)
假设自定义授权程序是lambda函数,暗示您的API网关是与Lambda的代理集成 - 您可以在lambda函数中执行此操作。
取决于您请求的资源,例如: / acc / reg - 您可以在lambda函数中检测到这一点并绕过身份验证。 对于所有其他资源,您可以通过自定义授权过程。
您可以定义变量来存储您的安全与不安全资源,并根据请求匹配
var insecureApis = '/hello,/acc/reg';
var secureApis = '/account/me';
var path = event.path;
if(secureApis.includes(path)){
//perform custom auth and proxy request
} else {
// just proxy
}
答案 2 :(得分:0)
由于我们不会将请求代理到后端API,而是将Lambda用于所有API调用,因此不确定是否可以直接回答OP,但是我们仍然只需要授权部分API。这是我们的方法:
我们有一个与SAM一起部署的API,在此项目中,我们对大多数api使用了自定义授权程序。
MonitorApi:
Type: AWS::Serverless::Api
Properties:
Cors:
AllowMethods: "'OPTIONS,POST,GET,PATCH,DELETE'"
AllowHeaders: "'*'"
AllowOrigin: "'*'"
StageName: !Ref AppStage
GatewayResponses:
DEFAULT_4xx:
ResponseParameters:
Headers:
Access-Control-Expose-Headers: "'*'"
Access-Control-Allow-Headers: "'*'"
Access-Control-Allow-Origin: "'*'"
Auth:
DefaultAuthorizer: LambdaTokenAuthorizer # This authorizer is used on the API
AddDefaultAuthorizerToCorsPreflight: false
Authorizers:
LambdaTokenAuthorizer:
FunctionArn: !GetAtt AuthorizeFunction.Arn
Identity:
Header: Authorization
ReauthorizeEvery: 300
对于某些需要公开使用的资源,我们在功能级别上对此进行了覆盖,如下所示:
SystempingFunction: # Systemping service in API
Type: AWS::Serverless::Function
Properties:
CodeUri: monitor/
Handler: systemping.handler
Runtime: nodejs12.x
Timeout: 20
Events:
SystempingEvent:
Type: Api
Properties:
Auth:
Authorizer: NONE # Turn off Authorization for this function
Path: /systemping
Method: get
RestApiId: !Ref MonitorApi