代码之家  ›  专栏  ›  技术社区  ›  SaidAkh

如何在AWS Amplify/AppSync React应用程序中正确处理未经验证的用户和请求?

  •  1
  • SaidAkh  · 技术社区  · 7 年前

    我很难想出如何在使用AWS Amplify和AWS AppSync的React应用程序中处理未经验证的用户。似乎大多数文档都建议用 withAuthenticator aws-amplify-react

    下面是我如何设置一个客户端来与AppSync API对话

    const client = new AWSAppSyncClient({
      url: AppSyncConfig.aws_appsync_graphqlEndpoint,
      region: AppSyncConfig.aws_appsync_region,
      auth: {
        type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS,
        jwtToken: async () =>
          (await Auth.currentSession()).getIdToken().getJwtToken()
      }
    });
    

    然后我把顶层包起来 App export default withAuthenticator(App);

    所有这些工作,用户点击根URL并获得一个登录视图。如上所述,在现实世界中,这是一个非常罕见的案例。通常,根URL以及其他许多URL都对未经身份验证的用户开放。如何使用AWS Amplify实现此功能没有文档,没有图坦卡蒙:-(

    我发现了一些如何使它工作的提示 here ,但仍然没有完整的解释。

    2 回复  |  直到 7 年前
        1
  •  12
  •   Nader Dabit    5 年前
    1. 请确保通过运行更新身份验证设置以启用经过身份验证和未经身份验证的访问 amplify update auth

    2. 在API请求中,现在可以指定身份验证模式:

    const createdTodo = await API.graphql({
      query: queries.createTodo,
      variables: {input: todoDetails},
      authMode: 'AWS_IAM'
    });
    

    Here are more detailed docs


    使用以下步骤,您可以同时允许已验证和;未经验证的AWS AppSync API访问权限:

    1. 创建一个放大项目
    amplify init
    
    1. 使用自定义安全配置添加身份验证:
    amplify add auth
    

    用户注册、登录,与AWS IAM控件连接(为图像或其他内容、分析等启用每用户存储功能)

    请为您的资源提供一个友好的名称,用于在项目中标记此类别: 你的名字

    请为您的标识池输入名称。

    为其余问题选择默认值

    1. 添加api
    amplify add api
    

    选择 Amazon Cognito用户池 作为授权类型。

    1. 创建API
    amplify push
    
    1. AWS身份和访问管理(IAM)

    2. aws.exports.js 在客户端应用程序上,更改 aws_appsync_authenticationType AWS_IAM

    3. 单击“编辑身份池”查看您的“未经身份验证的角色”&“已验证角色”

    4. 打开IAM控制台&从步骤8中查找“未经验证的角色”

    5. 单击“添加内联策略”

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "appsync:GraphQL"
                ],
                "Resource": [
                    "arn:aws:appsync:<REGION>:<ACCOUNTID>:apis/<APIID>/types/Mutation/fields/listTodos"
                ]
            }
        ]
    }
    
    1. 单击“添加内联策略”

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "appsync:GraphQL"
                ],
                "Resource": [
                    "arn:aws:appsync:<REGION>:<ACCOUNTID>:apis/<APIID>/types/Mutation/fields/listTodos",
                    "arn:aws:appsync:<REGION>:<ACCOUNTID>:apis/<APIID>/types/Mutation/fields/createTodo"
                ]
            }
        ]
    }
    
    import { Auth } from 'aws-amplify'
    Auth.currentCredentials()
      .then(d => console.log('data: ', d))
      .catch(e => console.log('error: ', e))
    
    如果要访问登录用户的唯一身份以进行用户授权&细粒度访问控制,您可以访问 $context.identity.cognitoIdentityId 在解析器中。
        2
  •  0
  •   FranciscoR    7 年前

    我猜用例是给unauth和auth用户访问GraphQLAPI的权限,给他们不同的权限(例如auth用户可以执行一些查询,unauth用户可以执行一些查询)。如果是这种情况,您需要在AppSync API上将AWS IAM配置为身份验证类型,还需要具有unauth和auth访问权限的Amazon Cognito IdentityPool,并根据您的要求为这些配置IAM角色。

    你可以找到更详细的答案 here

        3
  •  0
  •   MonsCamus    5 年前

    对任何遭受未经授权(您的问题是AppSync)或401(您的问题是IAM/未经授权的角色设置)的人提供一点额外帮助。

    我们有COGNITO池作为默认授权人。为了使用AWS_IAM,您需要将其添加到AppSync中,然后调整身份池的UNAUTH角色(如上所述)。但还有最后一个问题--

    在匿名事务中涉及的查询/变异/模型上添加@aws_iam指令,这将停止放大返回未经授权的错误,但是如果不允许对象字段也使用该指令,则很可能会看到更多返回的错误。

    https://aws.amazon.com/blogs/mobile/using-multiple-authorization-types-with-aws-appsync-graphql-apis/