GraphQL

认证和 Express 中间件

Express 中间件可以很方便地结合 express-graphql 使用,这也是一个良好的认证处理模式。

你可以就像普通 Express 应用使用中间件一样把中间件和 GraphQL 解析器一起使用。然后 request 对象就会作为解析函数的第二参数传入。(译者注:v0.5.0 之后,作为第三参数)

举个例子,假设我们想要服务器记录每个请求的 IP 地址,并编写一个返回调用者 IP 地址的 API。前者我们通过中间件完成,后者在解析器中取 request 对象即可。下面是实现这个功能的服务端代码:

var express = require('express');
var graphqlHTTP = require('express-graphql');
var { buildSchema } = require('graphql');

var schema = buildSchema(`
  type Query {
    ip: String
  }
`);

const loggingMiddleware = (req, res, next) => {
  console.log('ip:', req.ip);
  next();
}

var root = {
  ip: function (args, request) {
    return request.ip;
  }
};

var app = express();
app.use(loggingMiddleware);
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true,
}));
app.listen(4000);
console.log('Running a GraphQL API server at localhost:4000/graphql');

在 REST API 中,认证通常是借由 header 处理的,其中包含一个 auth token 用于识别发出请求的用户。Express 中间件会处理这些 header,并将认证数据放进 Express 的 request 对象。像这样处理认证的中间件模块有 Passportexpress-jwtexpress-session。这些模块每一个都能配合 express-graphql 使用。

如果你对这些认证机制都不熟悉,我们推荐使用 express-jwt,因为它既简单又不会牺牲任何后期的弹性。

如果你是从头读到这儿的,那么恭喜你!你现在已经知道构建一个 GraphQL API 服务器的所有知识了。

继续阅读 →构建类型