gpt4 book ai didi

express - 谷歌 Passport 回调后设置cookie

转载 作者:行者123 更新时间:2023-12-04 13:53:37 30 4
gpt4 key购买 nike

我正在使用 facebookgoogle oauth2使用 passport js 登录, 有了这个流

  • 用户点击登录按钮
  • 重定向到 facebook/google auth 页面(取决于用户选择的登录方式)
  • 身份验证页面重定向回回调页面 ( /auth/callback/[provider] )
  • 一个passport express中间件会捕获它来解析一些数据,然后将其发送到我自己的远程api以在
  • 中对用户进行签名。
  • auth 远程 api 将发送一个包含用户 token
  • 的响应。
  • 自定义 express 中间件将捕获响应以在服务器上设置 cookie
  • express 链通过将其路由到 /profile 而结束(浏览器上设置了带 token 的cookie)
  • /profile然后将检查是否有 token ,如果没有:它将重定向到 /

  • facebook 上执行此流程登录没问题,用户成功重定向到 /profile ,及其所有数据和 token , google oauth2然而,登录似乎正在重定向到 /profile然后设置 token (步骤 #7 然后 #6),所以每次用户使用 google oauth2登录,它总是会被重定向回 /因为当它到达 /profile 时,它没有 token
    这是上面流程中的代码
    #./server.js
    const express = require('express')
    const next = require('next')
    const Passport = require('./server/middleware/passport')

    const Api = require('./server/api')

    const port = parseInt(process.env.PORT, 10)
    const dev = process.env.NODE_ENV !== 'production'
    const app = next({ dev })
    const handle = app.getRequestHandler()

    app
    .prepare()
    .then(() => {
    const server = express()
    // ... other unrelated things
    server.use(Passport.initialize())

    Api.passport.facebook(server)
    Api.passport.facebookCallback(server)
    Api.passport.google(server)
    Api.passport.googleCallback(server)

    // ... other unrelated things

    server.all('*', (req, res) => handle(req, res))

    server.listen(port, (error) => {
    if (error) throw error

    // ... other unrelated things
    })
    })
    #./server/api.js
    const Passport = require('middleware/passport')

    function setCookie(req, res, next) {
    res.cookie('token', req.user.auth.token, {
    httpOnly: true,
    sameSite: 'strict',
    path: '/',
    secure: process.env.NODE_ENV !== 'development',
    })
    next()
    }

    function facebook(app) {
    return app.get('/auth/facebook', (req, res, next) => {
    Passport.authenticate('facebook', {
    scope: ['email', 'public_profile']
    })(req, res, next)
    })
    }

    function facebookCallback(app) {
    return app.get(
    '/auth/callback/facebook',
    Passport.authenticate('facebook', { session: false, failureRedirect: '/' }),
    setCookie,
    (req, res) => {
    res.redirect('/profile')
    },
    )
    }

    function google(app) {
    return app.get('/auth/google', (req, res, next) => {
    Passport.authenticate('google', {
    scope: [
    'https://www.googleapis.com/auth/userinfo.email ',
    'https://www.googleapis.com/auth/userinfo.profile ',
    ],
    prompt: 'consent',
    authType: 'rerequest',
    accessType: 'offline',
    })(req, res, next)
    })
    }

    function googleCallback(app) {
    return app.get(
    '/auth/callback/google',
    Passport.authenticate('google', { failureRedirect: '/', session: false }),
    setCookie,
    (req, res) => {
    res.redirect('/profile')
    },
    )
    }

    module.exports = {
    passport: {
    facebook,
    facebookCallback,
    google,
    googleCallback,
    }
    }
    #./server/middleware/passport.js
    const axios = require('axios')
    const passport = require('passport')
    const GoogleStrategy = require('passport-google-oauth20').Strategy
    const FacebookStrategy = require('passport-facebook').Strategy


    passport.serializeUser((user, done) => {
    done(null, user)
    })

    passport.deserializeUser((obj, done) => {
    done(null, obj)
    })

    function verifyCallback(req, ... , done) {
    process.nextTick(async () => {
    try {
    const options = {
    baseURL: baseUrl, // My remote api url
    method: 'POST',
    url: '/auth/signin',
    headers: {
    'Content-Type': 'application/json',
    },
    data: JSON.stringify({
    // email, fullname, etc
    }),
    }
    const response = await axios(options)

    return done(null, response.data)
    } catch (error) {
    const { response } = error
    return done(JSON.stringify(response.data, null, 2), null)
    }
    })
    }

    passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: callbackURLGoogle,
    passReqToCallback: true,
    }, verifyCallback))

    passport.use(new FacebookStrategy({
    clientID: process.env.FACEBOOK_CLIENT_ID,
    clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
    callbackURL: callbackURLFacebook,
    enableProof: true,
    profileFields: ['id', 'name', 'email', 'picture.type(large)'],
    passReqToCallback: true,
    }, verifyCallback))

    module.exports = passport
    console.log()事情,只是为了弄清楚它是否属于正确的流程顺序,控制台似乎没有记录任何可疑的东西,我在这里遗漏了什么吗?
    PS:我也在用 next jscustom server

    最佳答案

    我遇到了同样的问题,并且能够使用自定义回调发送 cookie。

    router.get('/google/callback', (req, res) => {
    passport.authenticate('google', {session: false, failureRedirect:'/auth/google/failure'},
    async(err, user) => {

    // You can send cookies and data in response here.

    })(req, res)
    })
    请参阅 documentation 中的自定义回调部分为解释。

    关于express - 谷歌 Passport 回调后设置cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66514683/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com