Relay / GraphQL上的身份验证和权限

时间:2016-01-14 18:12:56

标签: javascript authentication graphql relayjs

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

假设我有一个可从GraphQL获取的用户表,我不希望向除了登录用户之外的任何人提供用户信息,我应该在什么级别添加身份验证层?

在模式级别通过改变“登录”状态?

或者可以将额外的参数传递给目前仅graphqlquery的{​​{1}}函数?

5 个答案:

答案 0 :(得分:10)

可以将带有令牌的auth标头添加到GraphQL查询中。

var token = localStorage.getItem('id_token');

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

答案 1 :(得分:3)

此博文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

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

第三种方法是这样的:

{
  viewer(token: String) {
    name
  }
}

将auth令牌传递给viewer,让graphql处理它

你也需要一个突变:

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

将返回令牌或错误。 该令牌应存储在网络上的Cookie或本地存储中,并存储在AsyncStorage上的React Native

答案 2 :(得分:1)

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

例如,如果您使用:

致电graphql
graphql(schema, query, auth, variables)

在您的解析功能中,您可以访问auth

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

答案 3 :(得分:1)

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

此网络层支持中间件,您可以注入 authMiddleware 以指定每个中继请求的身份验证令牌。如果服务器无法授权请求(即将用户发送到登录屏幕),您还可以指定要执行的操作。查看如何设置它的示例:

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页面。

答案 4 :(得分:0)

因此,在服务器端,您可以检查我创建的此回购,该回购显示了如何使用GraphQL突变处理登录/注销: https://github.com/shalkam/graphql-login

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