2

私は解析アプリを持っており、各リクエストで sessionToken を送信したいので、どのユーザーが何にアクセスしているかがわかります。この投稿が言及したように。

GraphQL + parse.com で Web アプリを構築するには?

ダニエルがこのコメントを残しましたが、私は彼が言及していることを実行できないようです.

ユーザーがクライアントにサインインしている場合は、セッション トークンをサーバーに渡して、そのセッション トークンを使用して解析クエリを実行できる可能性があります (ACL の理由により)。

リレーでは、sessionToken を を介して networkLayer に注入できることがheadersわかりますが、私の graphql サーバーでは、rootValueプロパティを介してこの sessionToken と情熱を graphql にアクセスできないようです。

parse-server と authentication の使用方法を理解した人はいますか? F8 アプリにはスタブがあり、現在は としてマークされており、TODOこれを理解できません。

4

1 に答える 1

3

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.injectNetworkLayerようにこのヘッダーを含めるために使用します。

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

Apollo Client を使用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,
});
于 2016-07-19T21:32:49.847 に答える