【问题标题】:Authentication and privileges on Relay/GraphQLRelay/GraphQL 上的身份验证和权限
【发布时间】:2016-04-20 04:53:47
【问题描述】:

Facebook 没有提及他们的 GraphQL 库的身份验证。

假设我有一个可从 GraphQL 获取的用户表,并且我不希望将用户信息透露给除登录用户之外的任何需要它的人,我应该在哪个级别添加身份验证层?

在架构级别通过改变“登录”状态?

或者也许通过将额外的参数传递给当前只接受queryschemagraphql 函数?

【问题讨论】:

    标签: javascript authentication graphql relayjs


    【解决方案1】:

    所以,在服务器端,您可以查看我创建的这个 repo,展示如何使用 GraphQL 突变处理登录/注销: https://github.com/shalkam/graphql-login

    它使用 passport.js 进行身份验证。

    【讨论】:

      【解决方案2】:

      这篇博文https://medium.com/the-graphqlhub/graphql-and-authentication-b73aed34bbeb#.cpmrcqcyt 描述了 Relay 的 3 种身份验证类型。

      1 - 基于令牌 (https://stackoverflow.com/a/34843562/2628278) - 这个扩展性更好\o/

      2 - 基于 rootValue (https://stackoverflow.com/a/36001558/2628278)

      3 - 仅基于 Relay 和 GraphQL

      前两种方法的问题是你需要使用非relay/graphql代码来处理这个。

      第三种方法是这样的:

      {
        viewer(token: String) {
          name
        }
      }
      

      将身份验证令牌传递给查看器,让 graphql 处理它

      你也需要一个突变:

      mutation {
        createToken(username: String!, password: String!) {
          token
          error
        }
      }
      

      这将返回令牌或错误。 令牌应存储在网络上的 cookie 或本地存储中,以及 AsyncStorage 上的 React Native

      【讨论】:

        【解决方案3】:

        虽然文档中并不清楚,但除了schemaquery(或文档中称为requestString)之外,您还可以传递rootValue。该值将传递给 GraphQL 架构中的每个解析函数,因此您希望在其中放置与请求配对的任何身份验证信息。

        例如,如果您通过以下方式调用graphql

        graphql(schema, query, auth, variables)
        

        在您的解析函数中,您将可以访问auth

        async user(auth, args) {
          return await db.users.find(auth, args.id)
        }
        

        【讨论】:

          【解决方案4】:

          另一种选择是使用默认网络层以外的中继网络层,例如nodkz/react-relay-network-layer

          这个网络层支持中间件,你可以注入一个authMiddleware来为每个Relay请求指定Auth Token。您还可以指定如果服务器无法授权请求(即,将用户发送到登录屏幕)该怎么办。查看如何设置的示例:

          import { RelayNetworkLayer, urlMiddleware, authMiddleware } from 'react-relay-network-layer';
          
          const middlewares = [
            urlMiddleware({
              url: () => `${graphqlAPIHost}/dragon/v2/graph`
            }),
            authMiddleware({
              token: () => auth.accessToken(), // Here you retrieve the Auth Access Token
              tokenRefreshPromise: (req) => {
                loginActions.logout(); // Here you specify what to do if the server returns 401
                return req;
              }
            })
          ];
          Relay.injectNetworkLayer(new RelayNetworkLayer(middlewares, { disableBatchQuery: true }));
          

          这将在请求标头中发送身份验证令牌。欲了解更多信息,请访问nodkz/react-relay-network-layer github 页面。

          【讨论】:

            【解决方案5】:

            可以将带有令牌的身份验证标头添加到您的 GraphQL 查询中。

            var token = localStorage.getItem('id_token');
            
            Relay.injectNetworkLayer(
              new Relay.DefaultNetworkLayer('http://pathtohost/graphql', {
                headers: {
                  Authorization: token
                }
              })
            );
            

            【讨论】:

            • 这仍然有效吗?我在中继现代文档中找不到injectNetworkLayer
            猜你喜欢
            • 2016-12-01
            • 2020-04-14
            • 1970-01-01
            • 2021-03-10
            • 2012-12-02
            • 2018-12-02
            • 2014-01-11
            • 2016-01-11
            • 2012-02-18
            相关资源
            最近更新 更多