GraphQL LogoGraphQL

身份验证和 Express 中间件

将任何 Express 中间件与 graphql-http 结合使用非常简单。特别是,这对于处理身份验证来说是一个很好的模式。

要在 GraphQL 解析器中使用中间件,只需像在普通 Express 应用程序中一样使用中间件即可。然后,request 对象作为任何解析器的第二个参数可用。

例如,假设我们希望我们的服务器记录每个请求的 IP 地址,并且我们还想编写一个返回调用者 IP 地址的 API。我们可以使用中间件来完成前者,并通过访问解析器中的 request 对象来完成后者。以下是实现此目的的服务器代码

var express = require("express")
var { createHandler } = require("graphql-http/lib/use/express")
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.all(
"/graphql",
createHandler({
schema: schema,
rootValue: root,
graphiql: true,
})
)
app.listen(4000)
console.log("Running a GraphQL API server at localhost:4000/graphql")

在 REST API 中,身份验证通常通过包含身份验证令牌的标头来处理,该令牌证明是哪个用户发出了此请求。Express 中间件处理这些标头并将身份验证数据放在 Express request 对象上。一些处理此类身份验证的中间件模块是 Passportexpress-jwtexpress-session。这些模块中的每一个都与 graphql-http 协同工作。

如果您不熟悉任何这些身份验证机制,我们建议使用 express-jwt,因为它很简单,但不会牺牲任何未来的灵活性。

如果您已经线性地阅读了文档并到达了这一点,恭喜您!您现在已经了解了构建实用 GraphQL API 服务器所需的一切。

继续阅读 →构建类型