AWS API 网关 + Cognito 用户池授权方 + Lambda - 我需要设置哪个 HTTP-headers 和权限?

AWS API Gateway + Cognito User Pool Authorizer + Lambda - Which HTTP-headers and permissions do I need to set?

我无法通过 HTTP headers(没有 AWS API 网关 SDK)在 AWS 上获得我的 API 的 Cognito 用户池授权。

我的设置:

在 AWS 上:

在 iOS 客户端上

什么是工作:

API 方法通过无服务器正确部署。

我可以通过 Postman 调用 public(未设置为使用用户池)。

对于私有 API 方法,我可以看到在 API 网关管理控制台中设置了 Cognito 用户池授权方,其中 "Identity token source" 设置为 method.request.header.Authorization (默认值)如所述 here

在iOS,我可以正常注册并登录为用户。我可以将 AWS 凭证详细信息转储到控制台,显示 AccessKeySecretKeySessionKey.

在 iOS 上,我可以通过 RestKit 查询 public API。

当我尝试通过 Postman 调用私有 API 方法时,我返回了带有 body {"message": "Unauthorized"} 的 HTTP 错误 401。 (这是预期的,没有设置任何授权。)

失败:

测试授权,在Postman中,我试过了

结果始终是相同的 401 错误。

我需要将什么设置为 HTTP headers,以便授权对私有 API 的调用? "Authorization" 应该有效 - 也许我缺少一些角色权限?

如何更好地调试权限/授权流程?

这是如何获得 session:

AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:AWSCognitoUserPoolsSignInProvi‌​derKey]; 
AWSCognitoIdentityUser *user = [pool currentUser]; 
AWSTask<AWSCognitoIdentityUserSession *> *task = [user getSession];

那么,task.result.idToken.tokenString可以设为"Authorization"header,就可以了

感谢彼得的提示!

iOS(截至 2017 年 5 月 11 日)

 let headerParameters = [
               "Content-Type": "application/json",
               "Accept": "application/json",
               "AccessKey" : awsCredentials.accessKey,
               "SecretKey" : awsCredentials.secretKey,
               "SessionKey" : awsCredentials.sessionKey,
               "Authorization" :
                AWSCognitoUserPoolsSignInProvider.sharedInstance().getUserPool().currentUser()?.getSession().result?.idToken?.tokenString
            ]

您可以在成功登录后获取 awsCredentials 并将其存储在您自己的代码中的某个位置(AuthorizationService?)。我将 "Authorization" 值保留了这么久,以便开发人员更容易知道这个隐藏对象的完整位置。您应该将其保存在您自己的 AuthorizationService class 中(或作为 AwsCredentials 的扩展成员?)

如果您使用Swift3,您可以通过以下代码获取身份令牌。

        let pool = AWSCognitoUserPoolsSignInProvider.sharedInstance().getUserPool()
        let currentUser = pool.currentUser()
        let task = currentUser?.getSession()
        let identityToken = task?.result?.idToken?.tokenString
        print("identityToken: \(String(describing: identityToken))")