Facebook 没有提及他们的 GraphQL 库的身份验证。
假设我有一个可从 GraphQL 获取的用户表,并且我不希望将用户信息透露给除登录用户之外的任何需要它的人,我应该在哪个级别添加身份验证层?
在模式级别通过改变“登录”状态?
或者也许通过将额外的参数传递给当前只接受and的graphql
函数?query
schema
Facebook 没有提及他们的 GraphQL 库的身份验证。
假设我有一个可从 GraphQL 获取的用户表,并且我不希望将用户信息透露给除登录用户之外的任何需要它的人,我应该在哪个级别添加身份验证层?
在模式级别通过改变“登录”状态?
或者也许通过将额外的参数传递给当前只接受and的graphql
函数?query
schema
可以将带有令牌的 auth 标头添加到您的 GraphQL 查询中。
var token = localStorage.getItem('id_token');
Relay.injectNetworkLayer(
new Relay.DefaultNetworkLayer('http://pathtohost/graphql', {
headers: {
Authorization: token
}
})
);
这篇博文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
另一种选择是使用默认网络层以外的中继网络层,例如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 页面。
尽管文档中确实不清楚,但除了schema
and query
(或requestString
在文档中称为)之外,您还可以传递rootValue
. 该值将传递给 GraphQL 架构中的每个解析函数,因此您希望在其中放置与请求配对的任何身份验证信息。
例如,如果您调用graphql
:
graphql(schema, query, auth, variables)
在您的解决功能中,您可以访问auth
:
async user(auth, args) {
return await db.users.find(auth, args.id)
}
因此,在服务器端,您可以查看我创建的这个 repo,展示如何使用 GraphQL 突变处理登录/注销: https ://github.com/shalkam/graphql-login
它使用 passport.js 进行身份验证。