我正在配置具有各种前端(移动和Web应用程序)和单个API后端的应用程序,由Lambda提供支持并通过AWS API Gateway访问 .
由于我计划使用Cognito对用户进行身份验证和授权,因此我在API网关上设置了Cognito用户池授权程序和几种API方法 .
使用这样的架构,我的应用程序(例如iOS或Vue.js应用程序)从OAuth角度来看是客户端应用程序,而我的API网关后端是资源服务器 . 基于this Auth0 forum post,似乎很明显我应该在我的客户端应用程序中使用ID令牌,并传递访问令牌以授权我的API网关资源 .
当我点击Cognito /oauth2/authorize
endpoints 获取访问代码并使用该代码命中 /oauth2/token
endpoints 时,我得到3个令牌 - 一个访问令牌,一个ID令牌和一个刷新令牌 . 到目前为止一切顺利,因为我应该拥有我需要的东西 .
这是我遇到困难的地方 - 使用API网关Cognito用户池授权控制台上的测试功能,我可以粘贴ID令牌并传递(在屏幕上解码令牌) . 但是当我粘贴Access Token时,我得到 401 - unauthorized
.
在我的Cognito设置中,我只启用了 Authorization Code Grant
流,带有 email
和 openid
范围(这似乎是Cognito允许的最小值,因为我在尝试保存时遇到错误而至少没有勾选这些内容) .
我是否需要添加一些特定的范围才能让API Gateway使用访问代码授权请求?如果是这样,这些配置在哪里?
或者我错过了什么? API网关是否仅允许ID令牌与Cognito用户池授权程序一起使用?
2 回答
您可以使用具有适用于id令牌的相同授权程序的访问令牌,但是在用户池和APIG中还有一些其他设置要完成 .
即使完成此额外设置,您也无法使用内置授权程序测试功能和访问令牌,只能使用ID令牌 . 来自AWS的典型80%解决方案!
要使用访问令牌,您需要在
App Integration -> Resource Servers
下的用户池中设置资源服务器,这与您使用的内容无关,但我假设您使用<site>.com
作为标识符,并且您有一个名为api
的作用域 .不要转到APIG中的方法并输入方法的
Method Request
. 假设已经使用id标记测试了授权程序,则将<site>.com/api
添加到Settings -> OAuth Scopes
部分 .只需添加OAuth Scope,即可确保令牌现在必须是访问令牌,并且不再接受ID令牌 .
详情请见:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-enable-cognito-user-pool.html
是的,API Gateway仅使用idToken进行授权 .
在用户输入正确的凭据后,身份提供者提供访问代码,授权用户输入正确的凭据,客户端使用此访问代码只是为了从给定用户的
/oauth2/token
endpoints 获取idToken和refreshToken . 所有进一步的调用只会在Authorization标头中使用idToken .在您检索用户令牌后,即使该访问代码也会过期 .