@angelzzz

Как передать информацию об успешной авторизации в facebook с помощью passport.js в redux?

Использую стек MERN и для авторизации passport.js

В react компоненте (укороченная версия кода) у меня есть обычный вход и через facebook:

class Login extends Component {
  render() {
    return (
      <a href="/" onClick={this.onLogin}>Enter via email</a>
      <a href="https://localhost:5000/api/users/auth/facebook">Enter via facebook</a>
    )
  }
}


в server.js

// Passport middleware
app.use(passport.initialize());
// Passport Config
require("./config/jwt")(passport);
require("./config/facebook")(passport);
passport facebook strategy - facebook.js

const passport = require('passport')
const FacebookStrategy = require('passport-facebook').Strategy;
const mongoose = require("mongoose");
const User = mongoose.model("users");
const keys = require("./keys");

module.exports = passport => {
  passport.use(
    new FacebookStrategy(
      {
        clientID: keys.facebook.clientID,
        clientSecret: keys.facebook.clientSecret,
        callbackURL: "https://localhost:5000/api/users/auth/facebook/callback",
        profileFields: ['id', 'emails', 'name', 'picture.type(large)']
      },
      (accessToken, refreshToken, profile, done) => {
        // console.log("FacebookStrategy", profile);
        User.findOne({
          // 'facebook.id': profile.id 
          $or: [
            { 'facebook.id': profile.id },
            { 'email': profile.emails[0].value }
          ]
        })
          .then(user => {
            if (user) {
              console.log("__user already exists", user);
              if (user.facebook.id == undefined) {
                user.facebook.id = profile.id;
                user.facebook.token = accessToken;
                user.facebook.email = profile.emails[0].value;
                user.facebook.name = profile.name.givenName + ' ' + profile.name.familyName;
                user.save();
              }

              return done(null, user);
            } else {
              console.log("__user doens't exist", user);
              const newUser = new User({
                facebook: {
                  id: profile.id,
                  token: accessToken,
                  email: (profile.emails) ? profile.emails[0].value : undefined,
                },
                name: profile.name.givenName + ' ' + profile.name.familyName,
                email: (profile.emails) ? profile.emails[0].value : undefined,
                privilege: 1
              });

              newUser
                .save()
                .then(user => console.log("passport facebook save user -> ", user))
                .catch(err => console.log("passport facebook save err -> ", err))

              return done(null, newUser);
            };
          })
          .catch(err => console.log("Passport err ->  ", err));
      }
    ));
};


В api/routes.js

router.get("/auth/facebook",
  passport.authenticate('facebook', { session: false, scope: ['email'] }) //, { session: false, scope: ['email'] })
);

router.get('/auth/facebook/callback',
  passport.authenticate('facebook', {
    session: false,
    scope: ['email'],
    successRedirect: 'https://localhost:3000',
    failureRedirect: 'https://localhost:3000/login'
  }), (req, res) => {
    console.log("facebook success");
    res.redirect('https://localhost:3000');
    res.render('json', { data: JSON.stringify(req.user.access_token) });
  }
);


Со стороны бекенда все работает - юзер залогинивается. В случае обычного входа (JWT) я использую onClick который вызывает authAction который передает payload из БД а redux. Но я не могу понять как в redux передать информацию об успешной авторизации через facebook.
  • Вопрос задан
  • 219 просмотров
Пригласить эксперта
Ответы на вопрос 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Как вариант:
res.cookie(TOKEN_KEY, req.user.access_token);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы