15

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

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

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

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

4

5 回答 5

11

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

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

Relay.injectNetworkLayer(
  new Relay.DefaultNetworkLayer('http://pathtohost/graphql', {
    headers: {
      Authorization: token
    }
  })
);
于 2016-01-17T20:56:00.503 回答
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
  }
}

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

您还需要一个突变:

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

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

于 2016-06-04T21:52:51.860 回答
1

另一种选择是使用默认网络层以外的中继网络层,例如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 页面。

于 2016-08-07T17:19:11.713 回答
1

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

例如,如果您调用graphql

graphql(schema, query, auth, variables)

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

async user(auth, args) {
  return await db.users.find(auth, args.id)
}
于 2016-03-15T02:20:04.450 回答
0

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

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

于 2018-06-25T00:07:47.133 回答