当前位置: 首页 > 知识库问答 >
问题:

AWS API网关认知用户池授权器Lambda-我需要设置哪些HTTP标头和权限?

陈宜修
2023-03-14

我有问题通过HTTP头(没有AWS API网关SDK)在AWS上获得认知用户池的API授权。

我的设置:

在AWS上:

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

iOS客户

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

什么是工作:

API方法通过serverless正确部署。

我可以通过邮递员呼叫公众(未设置为使用用户池)。

对于私有API方法,我可以看到在API网关管理控制台中设置的Cognito用户池授权器,包括设置为方法的“Identity token source”。要求标题。授权(默认值),如下所述

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

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

当我试图通过Postman调用私有API方法时,我得到一个HTTP错误401,其正文为{“message”:“Unauthorized”}。(这是预期的,无需设置任何授权。)

什么失败:

为了测试授权,在《邮递员》中,我尝试了

  • 复制/粘贴AWS凭据的SessionKey我从iOS客户端获得的HTTP授权头-如这里定义的(最后一段-"API网关的Cognito用户池授权程序")
  • 并作为X-Amz-Security-Token

结果总是相同的401错误。

为了授权对私有API的调用,我需要将什么设置为HTTP头?“授权”应该有效-可能我缺少一些角色权限?

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

共有3个答案

葛浩阔
2023-03-14

如果您使用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))")
陈胤
2023-03-14

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
            ]

在成功登录时,您可以获得aws凭据,并将其存储在您自己的代码中(AuthorizationService?)。我保留了“授权”值这么长时间,这样开发人员就更容易知道这个隐藏对象的完整位置。您应该将其保存在您自己的AuthorizationService类中(或作为AwsCre的扩展成员?)

宋经赋
2023-03-14

以下是获取会话的方法:

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

然后,task.result.idToken.tokenString可以设置为授权头,并且它工作。

谢谢彼得的提示!

 类似资料:
  • 我试图让我的API网关与Cognito用户池授权器一起工作,但我似乎无法让它工作。我现在没有使用任何SDK。一些细节-对于Cognito pool,我将设置ID provider设置为Cognito user pool,Oauth flow'impilicit grant‘和scope设置为'openid'。创建了一个应用程序(&domain),还生成了客户端机密。电子邮件是唯一的字段。-在API

  • 我正在尝试将AWSAPI网关授权器与cognito用户池一起使用。当我使用AWSAPI网关控制台进行测试时,它运行良好。 但当我尝试在api中启用授权时,它会显示请查看下面的屏幕截图 有人能帮忙吗? 仅供参考,我已经按照这里提到的说明http://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-wi

  • 我遵循的方法是,我为每组用户创建一个单独的Cognito用户池。 当用户登录时,他将通过适当的用户池进行身份验证。 为了调用后续的API,我计划使用Lambda Authorizer。 我遇到了下面的链接,以验证ID令牌。 https://github.com/awslabs/aws-support-tools/blob/master/cognito/decode-verify-jwt/decod

  • 问题内容: 我一直在尝试使用axios向National Park Service API发出GET请求,并尝试了几种方法将请求标头中的API密钥设置为无效。任何帮助将不胜感激。 我努力了: 和 都返回401。当我在Postman中发送GET请求时工作,我在密钥字段中输入Authorization,在值字段中输入我的API密钥。 谢谢。 问题答案: 此问题是由浏览器中的CORS OPTIONS请求

  • 我有一个具有两个RESTendpoint的应用程序: 获取/api/产品(不安全) POST/api/产品(安全) 对于第一个endpoint,我不想发送“授权”标头。为此,我配置了以下xml: 对于第二个endpoint,我确实想发送“授权”标头。因此,我配置了这个xml: 令我惊讶的是,GET /api/products需要一个“授权”标头,它返回401。POST /api/products工

  • 我目前正在尝试设置一个对一个具有基本授权的REST API(Cloudsight)的POST请求。到目前为止我的代码是: null null 当我尝试并运行它时,我得到错误:Uncatted SyntaxError:无法对“XMLHttpRequest”执行“set requestHeader”:“authorization:”不是有效的HTTP头字段名。 有人知道代码出了什么问题吗?我对Java