AWS API Gateway + Cognito用户池授权程序+ Lambda - 我需要设置哪些HTTP标头和权限?

时间:2017-02-01 10:18:40

标签: restkit aws-lambda amazon-cognito amazon-iam

我无法通过HTTP标头(没有AWS API Gateway SDK)在AWS上为Cognito用户池授权我的API。

我的设置:

在AWS上:

  • 在AWS Lambda上实施的REST API(通过Serverless框架部署),
  • 使用类型LAMBDA_PROXY(无手动映射)通过API网关公开
  • 通过提供的“Cognito用户池授权程序”对API网关进行授权(无“AWS_IAM”选项,无自定义编码授权程序)
  • 通过Postman
  • 测试API

在iOS客户端上

  • 通过AWS Cognito注册/登录(从AWS Mobile Hub生成的演示Xcode项目复制的SDK和UI)
  • 使用AWSAPIGateway SDK通过RestKit访问REST API

工作原理:

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

我可以通过Postman呼叫公众(不设置使用用户池)。

对于私有API方法,我可以看到在API网关管理控制台中设置了Cognito用户池授权程序,包括设置为method.request.header.Authorization的“身份令牌源”(默认值),如所述here

在iOS上,我可以正确注册并以用户身份登录。我可以将AWS Credentials详细信息转储到控制台,显示AccessKeySecretKeySessionKey

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

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

失败的原因:

为了测试授权,在Postman中,我尝试了

结果始终是401错误。

为了授权调用私有API,我需要设置什么样的HTTP标头? "Authorization"应该有效 - 也许我错过了一些角色权限?

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

3 个答案:

答案 0 :(得分:2)

这是如何获得会话:

AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:AWSCognitoUserPoolsSignInProvi‌​derKey]; 
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))")