基于 AWS、Stripe 和 React 的订阅服务

问题描述 投票:0回答:1

我正在构建一个网站,前端使用 React,支付使用 Stripe,后端使用 AWS 服务。我想建立一个基于订阅的模型。我使用 AWS Cognito 进行身份验证,使用 DynamoDB 进行数据库,并使用 GraphQL 进行前端的 API 调用。我一直在尝试了解如何允许仅基于订阅的用户进行某些 GraphQL 调用。我不知道如何将这些东西放在一起

我在某处读到过有关使用自定义值自定义访问令牌的内容。但我不确定这是否是适合我的情况的最佳方法,如果注册用户尝试进行这些 API 调用之一并且即使他没有订阅也成功了怎么办

amazon-web-services stripe-payments authorization amazon-cognito aws-amplify
1个回答
0
投票

可能有多种方法可以解决这个问题。要记住的最重要的一点是您将需要使用访问令牌来确定任何授权决策。由于您还提到该应用程序涉及付款,因此请始终将安全性放在首位,并确保您满足适合您需求的任何安全状况。

完成您想要执行的操作(仅基于所提供的信息)的一种方法是使用 Amazon Cognito 中的组。作为非常基本(且简单)的示例,您可以在 Cognito 用户池中拥有一个“subscribedMembers”组。如果用户是该组的成员,则用户登录后颁发的访问令牌将包含名为

cognito:groups
的声明,并将显示组成员身份。以下是访问令牌中该声明的示例:

"cognito:groups": [   
    "subscribedMembers"
],

您可以在应用程序中创建一个流程,允许任何人注册并创建帐户。此一般步骤将简单地为您的应用程序的用户创建一个帐户。然后,您可以创建一个流程,允许用户成为您的应用程序的订阅用户,以满足您的任何要求。作为成为订阅用户的一部分,他们将被添加到“subscribedMembers”Cognito 组。例如,您的应用程序的后端可以调用 AdminAddUserToGroup API 来执行此过程。

从 GraphQL 角度来看,假设您正在使用 AWS AppSync,您可以根据此组成员身份执行授权决策。例如,您可以有一个如下所示的请求模板:

#foreach($group in $context.identity.claims.get("cognito:groups"))
    #if($group == "subscribedMembers")
        #set($inCognitoGroup = true)
    #end
#end
#if($inCognitoGroup)
{
    "operation" : "GetData"
    // INSERT YOUR LOGIC HERE
}
#else
    $utils.unauthorized()
#end

需要考虑的几件事:

  • 如果将 AppSync 与 Amazon Cognito 一起用于 GraphQL API,则在此过程中将验证所提供的访问令牌。如果您要使用访问令牌(在 AppSync 之外)执行任何其他操作,请确保始终首先验证并验证访问令牌。
  • 由于涉及付款,我高度考虑始终要求 MFA,甚至更好地利用 Cognito 的高级安全功能(又名 ASF)来获得自适应身份验证受损凭证检查
  • 等功能
  • 确保您了解安全最佳实践,特别是在保护已颁发的访问令牌方面。 OWASP 拥有一些很棒的资源,包括如何缓解与访问控制失效识别和身份验证失败相关的问题。
  • 说到访问令牌,请考虑颁发与您的用例相符的 TTL 最低的令牌。例如,可以颁发过期时间在 5 分钟到 1 天之间的访问令牌。注意:如果您使用 Cognito 的托管 UI,则最短时间将增加到 1 小时,因为托管 UI 会发出 1 小时的会话 cookie。
  • 我上面给出的关于使用组成员身份的示例是有效的,并且适用于非常简单的课程粒度授权用例。但是,如果您需要更细粒度的授权(考虑本质上更动态或运行时的授权决策),那么您应该考虑使用 Cognito 的访问令牌自定义(ASF 功能的一部分)在创建时修改访问令牌或考虑考虑使用亚马逊验证权限(又名 AVP)。

除了上述链接之外,这里还有一些其他资源可以提供帮助:

© www.soinside.com 2019 - 2024. All rights reserved.