如何将Auth中间件传递到Apollo GraphQL Server

问题描述 投票:0回答:1

我的应用程序.js

const mongoose = require('mongoose');
const dotenv = require('dotenv');
const { ApolloServer } = require('apollo-server');
const { startStandaloneServer } = require('@apollo/server/standalone');
const typeDefs = require('./apolloGraphql/schema');
const resolvers = require('./apolloGraphql/resolvers');
const auth = require('./Middleware/Auth');

dotenv.config({ path: './config/.env' });

const server = new ApolloServer({
  typeDefs,
  resolvers,
});

mongoose
  .connect(process.env.MONGOURI)
  .then((result) => {
    return server.listen(process.env.PORT, (req, res, next) => {
      console.log(`Server is Listening at PORT ${process.env.PORT}`);
    });
  })
  .then((res) => {
    return console.log(`Server is Running at ${res.url}`);
  })
  .catch((err) => {
    console.log(err);
  });

我的身份验证中间件

const jwt = require('jsonwebtoken');

module.exports = (req, res, next) => {
  try {
    const authHeader = req.get('Authorization');
    if (!authHeader) {
      const error = new Error('Not Authorized');
      error.status = 500;
      throw error;
    }
    const token = authHeader.split(' ')[1];
    const decodedToken = jwt.verify(token, process.env.JWT_SECRET);
    if (!decodedToken) {
      const error = new Error('Not Authorized');
      error.status = 500;
      throw error;
    }
    req.userId = decodedToken.userId;
    next();
  } catch (err) {
    console.log(err);
    next(err);
  }
};

如何像 Rest API 一样将此中间件传递到 Apollo 服务器。我是 Graphql 新手

我尝试像 Rest API 一样解决这个问题,并参考了一些项目和文档,但未能解决这个问题。我也很想知道套餐有没有变化

node.js graphql apollo middleware apollo-server
1个回答
0
投票

要将您的中间件传递到 Apollo Server,您需要使用 Apollo 的expressMiddleware,创建一个 Express 服务器添加您的中间件,然后将 Apollo 的中间件传递给它。

这是来自 Apollo 网站的示例(稍作修改),他们修改了 Express 中间件。

import { ApolloServer } from '@apollo/server';
import { expressMiddleware } from '@apollo/server/express4';
import express from 'express';
import http from 'http';
import cors from 'cors';
import bodyParser from 'body-parser';
import { typeDefs, resolvers } from './schema';

const app = express();

const httpServer = http.createServer(app);


const server = new ApolloServer({
  typeDefs,
  resolvers,
});
await server.start();

// Here you set up Express middleware 
app.use(
  '/',
  cors(),
  bodyParser.json({ limit: '50mb' }),
  // You can add your custom middleware here
  expressMiddleware(server, {
    // You can also process the req and res objects and pass data to your resolvers
    context: async ({ req }) => ({ token: req.headers.token }),
  }),
);

await new Promise((resolve) => httpServer.listen({ port: 4000 }, resolve));
console.log(`🚀 Server ready at http://localhost:4000/`);

考虑到您可能不希望使用全有或全无的中间件来进行快速身份验证,因为它将保护整个 graphql 端点。只要您的登录是在 GraphQL 之外完成的(如在用于登录的 REST 端点中),就可以了。

您可以在此处了解如何在 Apollo 中实现身份验证逻辑

© www.soinside.com 2019 - 2024. All rights reserved.