带有 Passport JWT 的 Apollo 服务器
Posted
技术标签:
【中文标题】带有 Passport JWT 的 Apollo 服务器【英文标题】:Apollo Server with Passport JWT 【发布时间】:2019-02-22 09:35:12 【问题描述】:我正在尝试使用护照 JWT 实现 graphql,但行为不是我所期望的。
graphql 端点不应该通过身份验证关闭,因为一些查询是公开的,我想知道如果用户使用解析器登录,如何让 graphql 打开并在内部过滤?
这是我现在的代码,它可以与 JWT 一起正常工作,但它会关闭 graphql 端点并返回“未授权”,除非我指定令牌。
import express from 'express'
import ApolloServer from 'apollo-server-express'
import passport from 'passport'
import passportJWT from 'passport-jwt'
import schema from './schemas'
const JWT_SECRET = process.env
const path = '/graphql'
// ...
const users = [
id: 1,
name: 'John',
email: 'john@mail.com',
password: 'john123'
,
id: 2,
name: 'Sarah',
email: 'sarah@mail.com',
password: 'sarah123'
]
// ...
const Strategy, ExtractJwt = passportJWT
const params =
secretOrKey: JWT_SECRET,
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
// ...
const strategy = new Strategy(params, (payload, done) =>
const user = users[payload.id] || null
if (user)
return done(null,
id: user.id
)
return done(new Error('The user has not been found'), null)
)
passport.use(strategy)
// ...
const app = express()
passport.initialize()
app.use(path, passport.authenticate('jwt', session: false ))
// ...
const server = new ApolloServer(
schema
)
server.applyMiddleware(
app,
path
)
app.listen(
port: 4000
,
() => console.log(`The GraphQL server is running on port $GRAPHQL_PORT`)
)
【问题讨论】:
【参考方案1】:如果 JWTToken 不存在,passport-jwt 将失败,未授权状态传递给 info。你可以像下面这样处理它们
app.use(path, bodyParser.json(), function(req, res, next)
passport.authenticate('jwt', (err, user, info) =>
if (err) res.status(500).send("error": err); return;
next();
)(req, res, next);
);
【讨论】:
以上是关于带有 Passport JWT 的 Apollo 服务器的主要内容,如果未能解决你的问题,请参考以下文章
带有护照 jwt 的非对称密钥。验证总是返回 Unauthorized
讨论:本地存储中 Passport-local JWT Token 的关注