使用 Passport 进行社交身份验证登录后如何重定向到个人资料页面? (角度,快递,护照,jwt)

Posted

技术标签:

【中文标题】使用 Passport 进行社交身份验证登录后如何重定向到个人资料页面? (角度,快递,护照,jwt)【英文标题】:How to redirect to profile page after social auth login with Passport ? (Angular, express, passport, jwt) 【发布时间】:2020-09-05 14:06:51 【问题描述】:

我正在使用护照在我的应用上使用 FB 或 Google 登录。

如果配置文件不存在,我会成功创建配置文件,但现在我不明白如何在我想登录时将这些信息发送到前面。 我尝试了很多类似使用res.cookie(blabla) 的东西,但不能在前面使用它。 res.send(blabla)只要打开一个json文件。

我确实错过了一些东西,但我不知道是什么。

这是我的passportjs文件:

import passport from 'passport';
import  UsersService  from './../services/users.service';
import  AuthService  from './../services/auth.service';
import * as jwt from 'jsonwebtoken';

let FacebookStrategy = require('passport-facebook').Strategy;
const usersService = UsersService.getInstance();

module.exports = function () 
    passport.use('facebook', new FacebookStrategy(
        clientID : CLIENTID,
        clientSecret    : CLIENTSECRET,
        callbackURL     : 'http://localhost:3000/auth/facebook/callback',
        profileFields: ['id', 'emails', 'name']
    ,
    function(access_token:any, refresh_token:any, profile:any, done:any) 
        process.nextTick(function() 
            usersService.getByEmail(profile.emails[0].value).then((result) => 
                if(result.email == profile.emails[0].value) 
                    console.log('EXISTE');
                    const userToken = 
                        email: result.email,
                        id: result.id
                    ;
                    const secret: any = process.env.JWT_SECRET;
                    const token = jwt.sign(userToken, secret);
                    let newUser : any = result;
                    newUser.jwtoken = token;
                    console.log(newUser)
                    return done(null, newUser)
                 else
                    console.log('EXISTE PAS')
                    let user: any = 
                        email : profile.emails[0].value,
                        username : profile.username
                    
                    usersService.create(user).then(result => 
                        return done(null, user)
                    )
                 
            )

        );
        
    ))

这是我的路线文件:

router.get('/facebook', passport.authenticate('facebook',  scope: 'email'  ))


    router.get('/facebook/callback', 
        passport.authenticate('facebook', 
            session: false,
            failureRedirect : 'http://localhost:4200/auth/signin'
        ), (req: any, res: Response) => 
            let token: any = req.user.jwtoken;
            res.send(token).redirect('http://localhost:4200/')
        
    );

【问题讨论】:

【参考方案1】:

所以我尝试了另一种重定向:

router.get('/facebook', passport.authenticate('facebook',  scope: 'email'  ))
    router.get('/facebook/callback', 
        passport.authenticate('facebook', 
            session: false,
            failureRedirect : 'http://localhost:4200/auth/signin'
        ), (req: any, res: Response) => 
            let user: any = req.user;
            res.redirect('http://localhost:3000/users/me', user);
        
    );

现在我有一个错误:

FacebookTokenError: This authorization code has been used.
    at Strategy.parseErrorResponse (/home/alex/eygdev/EYG_post-WCS-internship/node_modules/passport-facebook/lib/strategy.js:198:12)
    at Strategy.OAuth2Strategy._createOAuthError (/home/alex/eygdev/EYG_post-WCS-internship/node_modules/passport-oauth2/lib/strategy.js:405:16)
    at /home/alex/eygdev/EYG_post-WCS-internship/node_modules/passport-oauth2/lib/strategy.js:175:45
    at /home/alex/eygdev/EYG_post-WCS-internship/node_modules/oauth/lib/oauth2.js:191:18
    at passBackControl (/home/alex/eygdev/EYG_post-WCS-internship/node_modules/oauth/lib/oauth2.js:132:9)
    at IncomingMessage.<anonymous> (/home/alex/eygdev/EYG_post-WCS-internship/node_modules/oauth/lib/oauth2.js:157:7)
    at IncomingMessage.emit (events.js:203:15)
    at IncomingMessage.EventEmitter.emit (domain.js:448:20)
    at endReadableNT (_stream_readable.js:1145:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)

我真的不明白为什么会出现这个错误,因为没有人登录我的网站。

【讨论】:

以上是关于使用 Passport 进行社交身份验证登录后如何重定向到个人资料页面? (角度,快递,护照,jwt)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用分离的后端和前端(Passport / Express / React)进行社交身份验证

使用 Passport 和 OAuth2 + 社交网络的 NodeJS REST 身份验证

GraphQL 中的社交身份验证

如何强制使用 Passport 进行身份验证

passport.js ,在弹出窗口中进行身份验证后,将其关闭并重定向父窗口

如何使用 Passport 对 GraphQL 端点进行身份验证?