我们可以使用自定义中间件函数实现对GraphQL查询中的身份验证逻辑的控制。代码示例如下:
const { ApolloServer, gql } = require('apollo-server');
const jwt = require('jsonwebtoken');
const { AuthenticationError } = require('apollo-server');
const typeDefs = gql`
type Query {
hello: String!
secret: String!
}
`;
const resolvers = {
Query: {
hello: () => "Hello world!",
secret: () => "This is a secret message."
}
};
const verifyToken = (token) => {
try {
return jwt.verify(token, 'secret_key');
} catch (error) {
throw new AuthenticationError('Invalid token!');
}
}
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => {
const authorization = req.headers['authorization'];
if (!authorization) throw new AuthenticationError('You must be logged in.');
const token = authorization.split(' ')[1];
const user = verifyToken(token);
return { user };
}
});
server.listen().then(({ url }) => {
console.log(`� Server ready at ${url}`);
});
在这个示例中,我们创建了一个自定义的verifyToken
函数,该函数使用JWT进行身份验证。然后我们创建了一个自定义中间件函数,并在Apollo Server的context
选项中使用它。中间件函数检查请求头中是否有授权信息,如果没有则抛出异常。如果有,则从授权头中提取token并使用verifyToken
函数进行身份验证。在身份验证成功后,我们将用户信息添加到上下文中,以供后续查询使用。
注意:在实际应用中,请使用适当的身份验证方式进行身份验证,例如OAuth 2.0。
以上代码示例需要安装以下依赖项:
npm install apollo-server graphql jsonwebtoken