首页 > 解决方案 > 在 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。

如果有人能向我解释这个丛林,那就太好了。

标签: aws-sdkaws-api-gatewayamazon-cognitoserverless-frameworkaws-serverless

解决方案


我自己想通了:

1)这取决于。我现在使用两者的组合,原因如下:对于 Facebook 登录,我们使用的是 Cognito 身份池,因为 Cognito 用户池不支持托管 UI 之外的 Facebook 登录。对于电子邮件注册和登录,我们使用 Cognito 身份池中的用户池。

2)我发布的代码片段是正确的。

3)代码片段也是正确的。我的错误是我没有正确显示和检查我的 API 的回复,因此认为该请求未经授权,但确实如此。


推荐阅读