我无法通过HTTP标头(没有AWS API Gateway SDK)在AWS上为Cognito用户池授权我的API。
我的设置:
在AWS上:
在iOS客户端上
工作原理:
通过无服务器正确部署API方法。
我可以通过Postman呼叫公众(不设置使用用户池)。
对于私有API方法,我可以看到在API网关管理控制台中设置了Cognito用户池授权程序,包括设置为method.request.header.Authorization
的“身份令牌源”(默认值),如所述here
在iOS上,我可以正确注册并以用户身份登录。我可以将AWS Credentials详细信息转储到控制台,显示AccessKey
,SecretKey
和SessionKey
。
在iOS上,我可以通过RestKit查询公共API。
当我尝试通过Postman调用私有API方法时,我收到了身体{"message": "Unauthorized"}
的HTTP错误401。 (这是预期的,没有设置任何授权。)
失败的原因:
为了测试授权,在Postman中,我尝试了
SessionKey
作为HTTP Authorization
标题 - 定义为here (last paragraph - "API Gateway’s Authorizer for Cognito User Pools") X-Amz-Security-Token
标题结果始终是401错误。
为了授权调用私有API,我需要设置什么样的HTTP标头? "Authorization"应该有效 - 也许我错过了一些角色权限?
如何更好地调试权限/授权流程?
答案 0 :(得分:2)
这是如何获得会话:
AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:AWSCognitoUserPoolsSignInProviderKey];
AWSCognitoIdentityUser *user = [pool currentUser];
AWSTask<AWSCognitoIdentityUserSession *> *task = [user getSession];
然后,task.result.idToken.tokenString
可以设置为&#34;授权&#34;标题,它的工作原理。
感谢彼得的提示!
答案 1 :(得分:2)
适用于iOS(截至2017年5月11日)
newUser = new User;
newUser.local.email = req.body.email;
newUser.local.username = req.body.username;
newUser.local.password=req.body.password;
newUser.save(function(err){
if(err) console.log(err)
res.json('Register Success');
});
您可以在成功登录时获取awsCredentials并将其存储在您自己的代码中(AuthorizationService?)。我保持“授权”值这么长,以便开发人员更容易知道这个隐藏对象的完整位置。您应该将它保存在自己的AuthorizationService类中(或作为AwsCredentials的扩展成员吗?)
答案 2 :(得分:1)
如果您使用Swift 3,您可以通过以下代码获取身份令牌。
let pool = AWSCognitoUserPoolsSignInProvider.sharedInstance().getUserPool()
let currentUser = pool.currentUser()
let task = currentUser?.getSession()
let identityToken = task?.result?.idToken?.tokenString
print("identityToken: \(String(describing: identityToken))")