Как использовать токен сеанса синтаксического анализа для выполнения запросов с помощью graphql

У меня есть приложение для синтаксического анализа, и я хочу отправлять sessionToken с каждым запросом, чтобы знать, какой пользователь к чему обращается. Так же, как упомянутый пост.

Как создать веб-приложение с помощью GraphQL + parse.com?

Дэниел оставил этот комментарий, и я не могу сделать то, что он упоминает.

Если пользователь вошел в систему на клиенте, вы потенциально можете передать токен сеанса на сервер, чтобы разрешить выполнение запросов на синтаксический анализ с этим токеном сеанса (по причинам ACL).

В Relay я вижу, что вы можете внедрить sessionToken в networkLayer через headers, но на моем сервере graphql я не могу получить доступ к этому sessionToken и страсти в graphql через свойство rootValue.

Кто-нибудь разобрался, как использовать parse-server и аутентификацию? Приложение F8 заглушено, в настоящее время оно помечено как TODO, и я не могу понять это.


person DrJid    schedule 11.05.2016    source источник


Ответы (1)


Express-Graphql поддерживает параметр context, который будет передан в качестве последнего аргумента всем вашим функции резольвера. Вы можете передать токен сеанса Parse в качестве заголовка для любых запросов /graphql, а затем перенаправить его через context следующим образом:

import graphqlHTTP from 'express-graphql';

const app = express();

app.use('/graphql', graphqlHTTP((req) => ({
  // ...
  context: {
    parseSessionToken: req.headers['parse-session-token'],
  },
})));

Теперь внутри функции распознавателя вы можете использовать этот токен со своими запросами, чтобы обеспечить применение соответствующего ACL:

function resolve (_, args, context) {
  return new Parse.Query('MyClass')
    .first({ sessionToken: context.parseSessionToken });
}

Если вы используете Relay на стороне клиента, используйте Relay.injectNetworkLayer чтобы включить этот заголовок следующим образом:

Relay.injectNetworkLayer(
  new Relay.DefaultNetworkLayer('http://example.com/graphql', {
    headers: {
      'parse-session-token': Parse.User.current().getSessionToken(),
    },
  })
);

Если вы используете клиент Apollo, используйте createNetworkInterface в промежуточной функции для заголовки питания:

import ApolloClient, { createNetworkInterface } from 'apollo-client';

const networkInterface = createNetworkInterface('http://example.com/graphql');

networkInterface.use([{
  applyMiddleware(req, next) {
    if (!req.options.headers) {
      req.options.headers = {};  // Create the header object if needed.
    }
    req.options.headers['parse-session-token'] = Parse.User.current().getSessionToken();
    next();
  }
}]);

const client = new ApolloClient({
  networkInterface,
});
person namuol    schedule 19.07.2016
comment
Спасибо @namuol, я использую Relay и хочу добавить функцию входа в систему на стороне клиента, чтобы получить токен пользователя. Есть ли простой способ сделать это? Нужно ли мне создавать отдельный API на экспресс-стороне или я могу использовать для этого graphQL? - person Ardavan Kalhori; 08.11.2016