我的用例是API网关背后的Lambda函数。我使用API作为代理,使用/ {proxy +}路径和方法ANY。我希望保护我的Lambda函数,以便只有授权用户才能执行它并仅使用此函数执行允许的操作。我知道,要走的路是创建自定义授权器。但我认为这种方法效果很差。
两个缺点:
每次使用我的API时,都会执行两个Lambda函数,而不是一个:authorizer和main Lambda。在我的情况下,两个Lambdas都将连接到数据库。授权者 - 验证用户并决定要返回的策略。主要Lambda - 执行其任务。它会花费额外的钱并降低我的应用程序的速度。
授权人只能决定是否允许用户执行我的功能。它无法决定是否允许用户通过Lambda函数执行某些特定操作。所以我的访问逻辑将被拆分:部分内容将在授权程序中,另一部分则更具体,在我的Lambda中。不是很好。
最好不要在我的情况下使用自定义授权器,只是将所有请求传递给我的主要Lambda,这将决定用户是否被授权?在后者中,它将发送代码为401(未授权)的响应。
我理解自定义授权器是一种更通用的方法,因为它允许保护除Lambda(HTTP,Mock等)之外的所有类型的API集成,但在我的情况下它是Lambda函数。
答案 0 :(得分:1)
当您使用AWS自定义授权程序功能授权用户时,它会提供TTL值,您可以在其中指示函数在给定用户令牌的特定时间段内缓存results。
回答第一点,这样自定义授权程序中的逻辑不会针对每次调用运行,而是缓存并返回从TTL内的自定义授权程序返回的API网关策略和上下文变量。
关于您的第二点,如果您能够将允许的用户操作映射到API网关路径,则自定义授权程序基本上可以决定用户可以执行的操作。这是使用API Gateway Policies实现的。
例如:您可以验证用户是否是自定义授权者中的管理员,并生成API网关策略,允许在API网关上执行 ... / users / create(POST)操作的权限从自定义授权器返回。
此外,在自定义授权程序中查询常用的用户和租户属性并在上下文变量中返回也是一种很好的做法,这样它就不需要在端点Lambda函数内总是查询它们。