如何将用户添加到 apollo 服务器的上下文对象中?
How to add user to the context object in apollo server?
当我使用 REST api 时,我曾经将用户放在 req.user 上,但现在我正在做我的第一个 graphql 身份验证,我很难将用户放在上下文对象上。
这是我正在尝试完成但不起作用的内容:
- 从令牌中获取管理员 ID 并从数据库中获取管理员
- 将获取的管理员添加到上下文对象,以便我可以在每个解析器之前检查管理员权限
export const validateAccessToken = async (req) => {
try {
const accessToken = req.headers.authorization.slice(7);
if (!accessToken) throw new AuthenticationError('Unauthorized access');
const { id } = verify(accessToken, process.env.JWT_ACCESS_SECRET);
const admin = await Admin.findById(id);
return admin;
} catch {
return null;
}
};
// index.js
import { validateAccessToken } from './auth';
const server = new ApolloServer({
modules: [auth],
context: ({ req, res }) => ({ req, res, admin: validateAccessToken(req) }),
});
admin
在context
中的值为Promise { <pending> }
上下文函数可以 return 承诺本身。您可以使函数异步或使用链接 API:
import { validateAccessToken } from './auth';
const server = new ApolloServer({
modules: [auth],
context: async ({ req, res }) => ({ req, res, admin: await validateAccessToken(req) }),
});
const server = new ApolloServer({
modules: [auth],
context: ({ req, res }) =>
validateAccessToken(req).then(admin => ({ req, res, admin })),
});
现在 admin 应该是上下文的一部分,不再是待处理的承诺。
当我使用 REST api 时,我曾经将用户放在 req.user 上,但现在我正在做我的第一个 graphql 身份验证,我很难将用户放在上下文对象上。
这是我正在尝试完成但不起作用的内容:
- 从令牌中获取管理员 ID 并从数据库中获取管理员
- 将获取的管理员添加到上下文对象,以便我可以在每个解析器之前检查管理员权限
export const validateAccessToken = async (req) => {
try {
const accessToken = req.headers.authorization.slice(7);
if (!accessToken) throw new AuthenticationError('Unauthorized access');
const { id } = verify(accessToken, process.env.JWT_ACCESS_SECRET);
const admin = await Admin.findById(id);
return admin;
} catch {
return null;
}
};
// index.js
import { validateAccessToken } from './auth';
const server = new ApolloServer({
modules: [auth],
context: ({ req, res }) => ({ req, res, admin: validateAccessToken(req) }),
});
admin
在context
中的值为Promise { <pending> }
上下文函数可以 return 承诺本身。您可以使函数异步或使用链接 API:
import { validateAccessToken } from './auth';
const server = new ApolloServer({
modules: [auth],
context: async ({ req, res }) => ({ req, res, admin: await validateAccessToken(req) }),
});
const server = new ApolloServer({
modules: [auth],
context: ({ req, res }) =>
validateAccessToken(req).then(admin => ({ req, res, admin })),
});
现在 admin 应该是上下文的一部分,不再是待处理的承诺。