我正在构建一个网站,前端使用 React,支付使用 Stripe,后端使用 AWS 服务。我想建立一个基于订阅的模型。我使用 AWS Cognito 进行身份验证,使用 DynamoDB 进行数据库,并使用 GraphQL 进行前端的 API 调用。我一直在尝试了解如何允许仅基于订阅的用户进行某些 GraphQL 调用。我不知道如何将这些东西放在一起
我在某处读到过有关使用自定义值自定义访问令牌的内容。但我不确定这是否是适合我的情况的最佳方法,如果注册用户尝试进行这些 API 调用之一并且即使他没有订阅也成功了怎么办
可能有多种方法可以解决这个问题。要记住的最重要的一点是您将需要使用访问令牌来确定任何授权决策。由于您还提到该应用程序涉及付款,因此请始终将安全性放在首位,并确保您满足适合您需求的任何安全状况。
完成您想要执行的操作(仅基于所提供的信息)的一种方法是使用 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
需要考虑的几件事:
除了上述链接之外,这里还有一些其他资源可以提供帮助: