簡體   English   中英

如何使用 ExpressJS 正確設置 Passport Google OAuth 2.0?

[英]How do I properly set up Passport Google OAuth 2.0 with ExpressJS?

我正在嘗試設置一些用戶身份驗證並希望使用 Google 的 OAuth2.0 來執行此操作。

到目前為止,我已經在console.cloud.google.com上建立了一個 Google API 項目並獲得了 OAuth 2.0 客戶端 ID 和客戶端密鑰(假設clientID = 'myID.apps.googleusercontent.com'clientSecret = 'mySecret' ) . 閑逛,我發現我應該使用passport ,我想使用passport-google-oauth20 (只是因為它的下載量最多,如果有更好的東西請告訴我)。 按照說明,我有:

.env.js

module.exports = {
    google: {
        clientID: 'myID.apps.googleusercontent.com',
        clientSecret: 'mySecret'
    }
}

app.js

const express = require('express')
const passport = require('passport')
const env = require('./.env.js')
const app = express()
const baseURL = 'https://api.mywebsite.com'

var GoogleStrategy = require('passport-google-oauth20').Strategy;

passport.use(new GoogleStrategy({
    clientID: env.google.clientID,
    clientSecret: env.google.clientSecret,
    callbackURL: baseURL + "/auth/google/callback"
  },
  function(accessToken, refreshToken, profile, cb) {
    User.findOrCreate({ googleId: profile.id }, function (err, user) {
      return cb(err, user);
    })
  }
))

app.get('/auth/google', passport.authenticate('google', {scope: ['profile']})
)

app.get('/auth/google/callback', passport.authenticate('google', {failureRedirect: '/login'}), (req, res) => {
        // Successful authentication, redirect home.
        res.redirect('/');
    }
)

當我啟動服務器並轉到https://api.mywebsite.com/auth/google時,我被重定向到https://accounts.google.com/signin/oauth/error?authError=some_mess&client_id=myID.apps.googleusercontent.com出現Error 400: redirect_uri_mismatch並在詳細信息中引用了redirect_uri: http://127.0.0.1:5000/auth/undefined/auth/google/callback 當我檢查 Google 控制台時,我明確允許https://api.mywebsite.com在授權的 JavaScript 來源和所有https://api.mywebsite.comhttps://api.mywebsite.com/auth/google/callbackhttp://127.0.0.1:5000/auth/undefined/auth/google/callback在授權重定向 URI 中。

我怎樣才能正確設置這一切?

獎勵:如果我想運行有效性檢查(比如確保用戶在數據庫中),我該怎么做?

您可以通過以下方式正確設置google oauth2.0:

const express = require('express')
const passport = require('passport')
const googleStrategy = require('passport-google-oauth20').Strategy;
const env = require('./.env.js')
const users =require('./../database/models/User'); //change this
const app = express()

//serialize user
passport.serializeUser((user,done)=>{
    done(null,user._id);
})

//deserialize user
//on the every request deserialize function checks user whether in database
passport.deserializeUser((id,done)=>{
    users.findOne({_id:new objectId(id)},(err,doc)=>{
        if(err){return done(err)};
        if(!doc){return done(null,false)}
        return done(null,doc);
    })
})

//GOOGLE STRATEGY
passport.use(new googleStrategy({
    clientID:  env.google.clientID,
    clientSecret:env.google.clientSecret,
    callbackURL:'https://api.mywebsite.com/auth/google/callback', //change this 
    passReqToCallback   : true
},function(request,accessToken, refreshToken, profile, callback){
    users.findOneAndUpdate({profile_id:profile.id},{ 
        $setOnInsert:{
            //your data that will insert when object is not found 
        }, 
        $set:{last_login:new Date() //if user exists update this field 
        //or something you want to update
    },{
        upsert:true, //if object didn't found, insert new object to db
        new:true //return updated data
    },(err,doc)=>{
        if(err){console.log(err)}
        return callback(null, doc);
    })
}))
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM