在GraphQL Node.js中使用JWT(JSON Web Token)可以实现身份验证和授权。JWT是一种用于安全传输信息的开放标准,它由三部分组成:头部、载荷和签名。
下面是在GraphQL Node.js中使用JWT的步骤:
jsonwebtoken
和express-jwt
这两个包。你可以使用以下命令进行安装:npm install jsonwebtoken express-jwt
const jwtSecret = require('crypto').randomBytes(64).toString('hex');
console.log(jwtSecret);
const jwt = require('jsonwebtoken');
const expressJwt = require('express-jwt');
const JWT_SECRET = 'your-jwt-secret'; // 替换为你的JWT密钥
const authMiddleware = expressJwt({
secret: JWT_SECRET,
algorithms: ['HS256'],
credentialsRequired: false // 如果不需要验证所有请求,可以将其设置为false
});
const getUserFromToken = (req) => {
const token = req.headers.authorization?.split(' ')[1];
if (token) {
try {
return jwt.verify(token, JWT_SECRET);
} catch (error) {
// 验证失败,返回null或者抛出错误
return null;
}
}
return null;
};
module.exports = { authMiddleware, getUserFromToken };
const { authMiddleware, getUserFromToken } = require('./auth');
const resolvers = {
Query: {
// 需要身份验证的查询
protectedQuery: (parent, args, context) => {
const user = getUserFromToken(context.req);
if (!user) {
throw new Error('未经授权的访问');
}
// 在这里处理受保护的查询逻辑
},
// 不需要身份验证的查询
publicQuery: (parent, args, context) => {
// 在这里处理公共查询逻辑
}
},
Mutation: {
// 需要身份验证的突变
protectedMutation: (parent, args, context) => {
const user = getUserFromToken(context.req);
if (!user) {
throw new Error('未经授权的访问');
}
// 在这里处理受保护的突变逻辑
},
// 不需要身份验证的突变
publicMutation: (parent, args, context) => {
// 在这里处理公共突变逻辑
}
}
};
module.exports = resolvers;
const express = require('express');
const { ApolloServer } = require('apollo-server-express');
const typeDefs = require('./schema');
const resolvers = require('./resolvers');
const { authMiddleware } = require('./auth');
const app = express();
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => ({ req })
});
app.use(authMiddleware);
server.applyMiddleware({ app });
app.listen({ port: 4000 }, () =>
console.log(`服务器已启动,访问地址:http://localhost:4000${server.graphqlPath}`)
);
现在,你可以在GraphQL Node.js中使用JWT进行身份验证和授权了。对于需要身份验证的查询和突变,用户必须在请求的Authorization
头部中提供有效的JWT。在解析器中,你可以使用getUserFromToken
函数来获取JWT中的用户信息,并根据需要进行授权和访问控制。
这是一个基本的使用JWT的示例,你可以根据自己的需求进行扩展和定制。关于JWT的更多信息和用法,请参考jsonwebtoken和express-jwt的文档。
领取专属 10元无门槛券
手把手带您无忧上云