首页 > 解决方案 > 使用谷歌身份验证护照单点登录

问题描述

短的:

嗨,我想用 nodejs express passport google oauth 进行单点登录

也许有人有一个很好的教程或示例代码

长:

基本上:

  1. 用户进入我的网站登录页面 www.mysite.com/login

  2. 点击“使用 Google 登录”

  3. Passport 完成工作并且用户已登录

现在到这里一切正常,我有用户登录并且他们正在会话中;我可以访问req.user但:

  1. 用户转到另一个站点 www.mysite2.com/home

他需要已经登录。但它不起作用。

此外,如果我再次单击登录页面 www.mysite.com/login 中的“使用 Google 登录”,Google 登录页面会再次显示并要求用户提供电子邮件密码。

我希望 Google 知道他们已经对用户进行了身份验证并向我发送了一个代码 (/auth/google/callback?code=4/SwCR3zt89...) 到我的回调路由 (www.mysite.com/auth/google/callback ) 例如。

以下是部分代码:

服务器.js

var express = require('express');
var passport = require('passport');
var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;

passport.serializeUser((user, done) => {
    done(null, user);
});
passport.deserializeUser((user, done) => {
    done(null, user);
});
passport.use(new GoogleStrategy({
    clientID: configService.getGoogleClientId(),
    clientSecret: configService.getGoogleClientSecret(),
    callbackURL: "http://localhost:3000/auth/google/callback"
},
 function (accessToken, refreshToken, profile, done) {

    User.findOrCreate({ googleId: profile.id }, function (err, user) {
    return done(err, user);
  });
}
));


var app = express();
app.use(session({
  secret: configService.getSessionSecret(),
  resave: false,
  saveUninitialized: false,
  //cookie: { secure: true }
}))
app.use(passport.initialize());
app.use(passport.session());

app.get('/auth/google',
  passport.authenticate('google', { scope: 
['https://www.googleapis.com/auth/plus.login'] }));

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

登录.html

<html>
<head></head>
<body>
  <a href="/auth/google">Sign In with Google</a>
</body>
</html>

标签: node.jsexpresssingle-sign-onpassport.jspassport-google-oauth2

解决方案


推荐阅读