Facebook没有提及他们的GraphQL库的身份验证。
假设我有一个可从GraphQL获取的用户表,我不希望向除了登录用户之外的任何人提供用户信息,我应该在什么级别添加身份验证层?
在模式级别通过改变“登录”状态?
或者可以将额外的参数传递给目前仅graphql
和query
的{{1}}函数?
答案 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)
虽然文档中确实不清楚,但除了schema
和query
(或文档中调用的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进行身份验证。