我正在为多个平台(iOS、Android、PWA(Web))创建一个移动应用程序,并使用 API Gateway 和 DynamoDb 在 AWS Lambda 上使用无服务器框架构建后端。
我最近的目标是使用 AWS Cognito 添加用户登录,使我的用户能够使用他们的电子邮件和密码登录,或者使用 Facebook 登录。我阅读了多个线程、教程和官方 AWS 文档,但由于大量不同的信息而感到非常困惑。
我想集成只有在用户登录时才能调用的授权 API 端点。
因此我的第一个问题是:
1) 我应该使用 AWS Cognito 用户池还是 AWS Cognito 身份池?
我还读到,对于用户池,您可以单独使用托管 UI 进行登录,这对我的应用程序来说是不可能的。我想设计我自己的登录页面。
由于我找不到客户端集成的任何示例代码,我现在使用身份池,并在我的 serverless.yml 中创建了一个端点,指定如下:
functions:
xxx-auth:
handler: endpoints/xxx-auth.execute
events:
- http:
path: xxx-auth
method: put
cors: true
integration: lambda
authorizer: aws_iam
所以我的第二个问题是:
2) 我如何正确集成我的 Cognito 身份池或用户池的授权?
从另一个线程我读到有可能为在 API Gateway 上创建的 API 生成一个 SDK,它为您处理请求的签名过程。当我尝试在我的 iOS 应用程序中这样做时,我首先使用以下代码登录用户:
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .EUCentral1 ,
identityPoolId:"eu-central-1:XXXXXXXX" ,
identityProviderManager: CustomIdentityProvider(tokens: ["graph.facebook.com": FBSDKAccessToken.current().tokenString]))
let configuration = AWSServiceConfiguration(region: .EUCentral1, credentialsProvider: credentialsProvider)
AWSServiceManager.default().defaultServiceConfiguration = configuration
然后使用以下创建的代码提交 PUT 请求:
public func XXXPut() -> AWSTask<AnyObject> {
let headerParameters = [
"Content-Type": "application/json",
"Accept": "application/json",
]
let queryParameters:[String:Any] = [:]
let pathParameters:[String:Any] = [:]
return self.invokeHTTPRequest("PUT", urlString: "/XXX", pathParameters: pathParameters, queryParameters: queryParameters, headerParameters: headerParameters, body: nil, responseClass: nil)
}
但是我看不到任何签署 HTTP 请求的代码。所以第三个问题是:
3) 我如何创建将签名的 HTTP 请求正确发送到我的 API 网关后端的 SDK?
我还使用简单的“授权”标头对 Cognito 用户池进行了相同的尝试,但无法找到一种在不使用任何类型的托管 UI 的情况下在 iOS 应用程序上获取相应授权令牌的方法。
如果有人能向我解释这个丛林,那将是非常友好的。
我自己想出来的:
1)这取决于。我现在使用两者的组合,原因如下:对于 Facebook 登录,我们使用 Cognito 身份池,因为 Cognito 用户池不支持托管 UI 之外的 Facebook 登录。对于电子邮件注册和登录,我们使用 Cognito 身份池中的 UserPool。
2)我发布的代码片段是正确的。
3)代码片段也是正确的。我的错误是我没有正确显示和检查我的 API 的回复,因此认为该请求未经授权,但事实确实如此。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句