我正在配置一个应用程序,其中包含各种前端(移动和Web应用程序)和单个API后端,由Lambda提供支持并通过AWS API Gateway进行访问。
由于我计划使用Cognito对用户进行身份验证和授权,因此我在API网关上设置了Cognito用户池授权程序和几种API方法。
使用这样的架构,我的应用程序(例如iOS或Vue.js应用程序)从OAuth角度来看是客户端应用程序,而我的API网关后端是资源服务器。基于this Auth0 forum post,我似乎应该在我的客户端应用程序中使用ID令牌,并传递访问令牌以授权我的API网关资源。
当我点击Cognito /oauth2/authorize
端点获取访问代码并使用该代码命中/oauth2/token
端点时,我获得3个令牌 - 访问令牌,ID令牌和刷新令牌。到目前为止一切顺利,因为我应该得到我需要的东西。
这是我遇到困难的地方 - 使用API网关Cognito用户池授权控制台上的测试功能,我可以粘贴ID令牌并传递(在屏幕上解码令牌)。但是当我粘贴访问令牌时,我得到401 - unauthorized
。
在我的Cognito设置中,我仅启用了Authorization Code Grant
流,email
和openid
范围(这似乎是Cognito允许的最小值,因为我在尝试保存时遇到错误没有至少这些勾选的。)
我是否需要添加一些特定的范围才能让API Gateway使用访问代码授权请求?如果是,那么这些配置在哪里?
或者我错过了什么? API网关是否仅允许ID令牌与Cognito用户池授权程序一起使用?
答案 0 :(得分:10)
您可以使用具有适用于ID令牌的相同授权程序的访问令牌,但在用户池和APIG中还有一些其他设置。
即使完成此额外设置,您也无法使用内置授权程序测试功能和访问令牌,只能使用ID令牌。来自AWS的典型80%解决方案!
要使用访问令牌,您需要在App Integration -> Resource Servers
下的用户池中设置资源服务器,这与您使用的内容无关,但我假设您使用<site>.com
作为标识符并且您拥有一个名为api
的范围。
不要转到APIG中的方法并为方法输入Method Request
。假设已经使用id标记测试了授权者,您可以将<site>.com/api
添加到Settings -> OAuth Scopes
部分。
只需添加OAuth范围,即可确保令牌现在必须是访问令牌,并且不再接受ID令牌。
答案 1 :(得分:0)
是的,API Gateway只会使用idToken进行授权。
用户输入正确的凭据后,身份提供商提供访问代码,授权用户输入正确的凭据,并且此访问代码由
客户端只是为了从给定用户的/oauth2/token
端点获取idToken和refreshToken。所有进一步的调用只会在Authorization标头中使用idToken。
即使访问代码在您检索用户令牌后过期。
答案 2 :(得分:0)
对于那些寻找答案但不使用OAuth并使用无服务器框架进行部署的人:
让APGW接受accessToken的工作对我来说是如下修改我的serverless.yml文件:
functions:
my-function:
handler: path to source file
events:
- http:
path: my-function
method: post
cors: true
authorizer:
type: COGNITO_USER_POOLS
scopes:
- YOUR SCOPE HERE <- THIS IS THE TRICK
authorizerId:
Ref: ApiGatewayAuthorizer
可以通过读取accessToken的内容(通过将令牌粘贴到https://jwt.io/调试器中)来找到范围的值。