Authentication and Access Control with Relay

前端 未结 3 1299
被撕碎了的回忆
被撕碎了的回忆 2021-02-01 07:40

The official line from Facebook is that Relay is \"intentionally agnostic about authentication mechanisms.\" In all the examples in the Relay repository, authentication and acce

3条回答
  •  醉梦人生
    2021-02-01 08:16

    I found that handling authentication is easy if you make use of the GraphQL rootValue, which is passed to the execution engine when the query is executed against the schema. This value is available at all levels of execution and is useful for storing an access token or whatever identifies the current user.

    If you're using the express-graphql middleware, you can load the session in a middleware preceding the GraphQL middleware and then configure the GraphQL middleware to place that session into the root value:

    function getSession(req, res, next) {
      loadSession(req).then(session => {
        req.session = session;
        next();
      }).catch(
        res.sendStatus(400);
      );
    }
    
    app.use('/graphql', getSession, graphqlHTTP(({ session }) => ({
      schema: schema,
      rootValue: { session }
    })));
    

    This session is then available at any depth in the schema:

    new GraphQLObjectType({
      name: 'MyType',
      fields: {
        myField: {
          type: GraphQLString,
          resolve(parentValue, _, { rootValue: { session } }) {
            // use `session` here
          }
        }
      }
    });
    

    You can pair this with "viewer-oriented" data loading to achieve access control. Check out https://github.com/facebook/dataloader which helps create this kind of data loading object and provides batching and caching.

    function createLoaders(authToken) {
      return {
        users: new DataLoader(ids => genUsers(authToken, ids)),
        cdnUrls: new DataLoader(rawUrls => genCdnUrls(authToken, rawUrls)),
        stories: new DataLoader(keys => genStories(authToken, keys)),
      };
    }
    

提交回复
热议问题