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 上:
- 在 AWS Lambda 上实现的 REST API(通过 Serverless 框架部署),
- 使用类型 LAMBDA_PROXY 通过 API 网关公开(无手动映射)
- 通过提供的 "Cognito User Pool authorizer" 在 API 网关上授权(无 "AWS_IAM" 选项,无自定义编码授权方)
- 正在通过 Postman
测试 API
在 iOS 客户端上
- Registration/Sign-In 通过 AWS Cognito(SDK 和 UI 从 AWS Mobile Hub 生成的演示 Xcode 项目复制)
- 通过 RestKit 访问 REST API, 而不是 使用 AWSAPI 网关 SDK
什么是工作:
API 方法通过无服务器正确部署。
我可以通过 Postman 调用 public(未设置为使用用户池)。
对于私有 API 方法,我可以看到在 API 网关管理控制台中设置了 Cognito 用户池授权方,其中 "Identity token source" 设置为 method.request.header.Authorization
(默认值)如所述 here
在iOS,我可以正常注册并登录为用户。我可以将 AWS 凭证详细信息转储到控制台,显示 AccessKey
、SecretKey
和 SessionKey
.
在 iOS 上,我可以通过 RestKit 查询 public API。
当我尝试通过 Postman 调用私有 API 方法时,我返回了带有 body {"message": "Unauthorized"}
的 HTTP 错误 401。 (这是预期的,没有设置任何授权。)
失败:
测试授权,在Postman中,我试过了
- copy/pasting 我从 iOS 客户端作为 HTTP
Authorization
header 获得的 AWSCredentials' SessionKey
- 按照定义 here (last paragraph - "API Gateway’s Authorizer for Cognito User Pools")
- 和
X-Amz-Security-Token
header
结果始终是相同的 401 错误。
我需要将什么设置为 HTTP headers,以便授权对私有 API 的调用? "Authorization" 应该有效 - 也许我缺少一些角色权限?
如何更好地调试权限/授权流程?
这是如何获得 session:
AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:AWSCognitoUserPoolsSignInProviderKey];
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))")
我无法通过 HTTP headers(没有 AWS API 网关 SDK)在 AWS 上获得我的 API 的 Cognito 用户池授权。
我的设置:
在 AWS 上:
- 在 AWS Lambda 上实现的 REST API(通过 Serverless 框架部署),
- 使用类型 LAMBDA_PROXY 通过 API 网关公开(无手动映射)
- 通过提供的 "Cognito User Pool authorizer" 在 API 网关上授权(无 "AWS_IAM" 选项,无自定义编码授权方)
- 正在通过 Postman 测试 API
在 iOS 客户端上
- Registration/Sign-In 通过 AWS Cognito(SDK 和 UI 从 AWS Mobile Hub 生成的演示 Xcode 项目复制)
- 通过 RestKit 访问 REST API, 而不是 使用 AWSAPI 网关 SDK
什么是工作:
API 方法通过无服务器正确部署。
我可以通过 Postman 调用 public(未设置为使用用户池)。
对于私有 API 方法,我可以看到在 API 网关管理控制台中设置了 Cognito 用户池授权方,其中 "Identity token source" 设置为 method.request.header.Authorization
(默认值)如所述 here
在iOS,我可以正常注册并登录为用户。我可以将 AWS 凭证详细信息转储到控制台,显示 AccessKey
、SecretKey
和 SessionKey
.
在 iOS 上,我可以通过 RestKit 查询 public API。
当我尝试通过 Postman 调用私有 API 方法时,我返回了带有 body {"message": "Unauthorized"}
的 HTTP 错误 401。 (这是预期的,没有设置任何授权。)
失败:
测试授权,在Postman中,我试过了
- copy/pasting 我从 iOS 客户端作为 HTTP
Authorization
header 获得的 AWSCredentials'SessionKey
- 按照定义 here (last paragraph - "API Gateway’s Authorizer for Cognito User Pools") - 和
X-Amz-Security-Token
header
结果始终是相同的 401 错误。
我需要将什么设置为 HTTP headers,以便授权对私有 API 的调用? "Authorization" 应该有效 - 也许我缺少一些角色权限?
如何更好地调试权限/授权流程?
这是如何获得 session:
AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:AWSCognitoUserPoolsSignInProviderKey];
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))")