aws-sdk - 在 AWS 上的无服务器后端为移动应用程序添加用户登录
问题描述
我正在为多个平台(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 Gateway 后端的 SDK?
我也为 Cognito 用户池尝试了相同的方法,使用简单的“授权”标头,但无法找到一种方法来获取 iOS 应用程序上的相应授权令牌,而不使用任何类型的托管 UI。
如果有人能向我解释这个丛林,那就太好了。
解决方案
我自己想通了:
1)这取决于。我现在使用两者的组合,原因如下:对于 Facebook 登录,我们使用的是 Cognito 身份池,因为 Cognito 用户池不支持托管 UI 之外的 Facebook 登录。对于电子邮件注册和登录,我们使用 Cognito 身份池中的用户池。
2)我发布的代码片段是正确的。
3)代码片段也是正确的。我的错误是我没有正确显示和检查我的 API 的回复,因此认为该请求未经授权,但确实如此。
推荐阅读
- java - 如何检查是否部署了 .war
- android - 在 recyclerview Android 中从 Spinner 获取所有选定的项目
- virtuoso - 如何通过 curl(通过 HTTP)向 Openlink Virtuoso 发送 SPARQL 查询并以 JSON 格式获取结果
- kubernetes - 为工作节点设置不同的内部 IP
- angular - 使用 NGX 和状态管理打开模态
- android - 我在按下音量按钮时收到此错误
- javascript - 提交表单应在成功提交到 Google 表格后显示消息
- sumo - 如何在多线高速公路上确定密度(车辆/公里)?
- laravel - 如何从 Laravel 和 VueJS 中的两个相关表中选择数据
- flutter - 使同一行中的另一个小部件可见后如何避免小部件位移?