Получение данных или любой метод получения данных аутентификации - PullRequest
1 голос
/ 01 августа 2020

На сервере. js (порт 4000) Я получил этот маршрут:

// Auth middleware that checks if the user is logged in
const isLoggedIn = (req, res, next) => {
  if (req.user) {
      next();
  } 
  else {
      res.sendStatus(401);
  }
}

app.get('/good', isLoggedIn, (req, res) => res.send(req.user));

или даже это:

app.get('/good', (req, res) => res.send(req.user));

Первоначально я хотел получить данные пользователя с помощью запроса graphql , но что угодно. Теперь я хочу получить эти данные req.user в моем компоненте реакции, клиент находится на порту 3000 (я просто хочу знать, вошел ли я в систему или нет). Я пробовал использовать fetch и ax ios, но похоже, что он не видел req.user (но когда я использую функцию isLoggedIn, он видит, что req.user is = "", и он показывает ошибку 401, как построена функция).

на http://localhost: 4000 / хорошие данные отображаются правильно.

Подробнее:

const express = require('express');
const cors = require('cors');
const path = require('path');
const mongoose = require('mongoose');
require('dotenv').config();
const passport = require('passport');
require('./modules/auth');

const cookieSession = require('cookie-session');

// #6 Initialize an Express application
const app = express();

// app.use(cors());

app.use(
  cors({
    origin: "http://localhost:3000",
    credentials: true
  })
);

app.use(cookieSession({
  name: 'session',
  keys: ['key1', 'key2']
}))

app.use(passport.initialize());
app.use(passport.session());

app.get('/auth/google', passport.authenticate('google', { scope: ['profile','email'] }));
app.get('/auth/google/callback', passport.authenticate('google', {
  successRedirect: 'http://localhost:4000/graphql',
  failureRedirect: 'http://localhost:4000/graphql',
}));


// Auth middleware that checks if the user is logged in
const isLoggedIn = (req, res, next) => {
  if (req.user) {
      next();
  } 
  else {
      res.sendStatus(401);
  }
}


app.get('/good', isLoggedIn, (req, res) => res.send(req.user));

// route for logging out
app.get('/logout', (req, res) => {
  req.session = null;
  req.logout();
  res.redirect('/');
  });




// Connect to Mongo and Apollo Server( skipped that, it's not the case)

// #7 Use the Express application as middleware in Apollo server( server was Apollo Server)
server.applyMiddleware({ app });

app.use(express.static('public'));

app.get('*', (req, res) => {
  res.sendFile(path.resolve(__dirname, 'public', 'index.html'))
});

const PORT = process.env.PORT || 4000;
app.listen(PORT, () => console.log(`Server started on port ${PORT}`));

Бонус: вот дополнительная идея ApolloServer :

сервер. js (пропущенная часть):

const { ApolloServer } = require('apollo-server-express');

const typeDefs = require('./modules/graphqlschemas/index');
const resolvers = require('./modules/resolvers/index');

// #5 Initialize an Apollo server
const server = new ApolloServer({ 
  typeDefs: typeDefs,
  resolvers: resolvers,
  // context: ({ req, res }) => ({ req, res }) 
  context: ({ req }) => ({
    getUser: () => req.user,
    logout: () => req.logout(),
  })
});

распознаватель пользователей (часть с текущим запросом пользователя):

module.exports = {
  Query: {
    users: () => User.find({}),
    currentUser: (parent, args, context) => context.getUser()
  },
...
...