0

我正在使用nodejs并使用passport npm模块实现了google-auth。但是我正在从 aws:ssm 参数中获取 google api-key 和 secret-key,例如服务器调用..

但问题是我们需要在护照初始化时解析api-key和secret-key。我不确定如何在护照初始化之前获取这些密钥我添加了promise函数仅用于获取客户端ID进行测试。我不确定初始化时如何调用异步调用。我附上了示例代码:

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

const AWS = require('aws-sdk');
const ssm = new AWS.SSM();

const getClientId = new Promise(function(resolve, reject) {
  const params = {
    Name: 'xxx',
    WithDecryption: false
  };
  ssm.getParameter(params, function(err, data) {
    if (err) {
      console.log('-----------', err)
      reject(err);
    } else {
      resolve(data);
    }
  });
});

var clientid = getClientId();

passport.use(new GoogleStrategy({
    consumerKey: clientid, //(needs to fetch from aws-ssm)
    consumerSecret: GOOGLE_CONSUMER_SECRET, //(needs to fetch from aws-ssm)
    callbackURL: "http://localhost:8080/auth/google/callback"
  },
  function(token, tokenSecret, profile, done) {
     return done(null,profile);
  }
));

module.exports { passport : passport }

我在不同文件中的路由器代码

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('/');
  });

有人可以帮我解决这个问题。

4

1 回答 1

0

由于护照依赖于异步任务,而不是要求passport,您需要将其作为主应用程序的参数传递,然后导出函数。

您可以等待,直到您获得客户端 ID 和其他所需信息。

护照初始化.js

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

const AWS = require('aws-sdk');
const ssm = new AWS.SSM();

const getClientId = new Promise(function(resolve, reject) {
  const params = {
    Name: 'xxx',
    WithDecryption: false
  };
  ssm.getParameter(params, function(err, data) {
    if (err) {
      console.log('-----------', err)
      reject(err);
    } else {
      resolve(data);
    }
  });
});

// Passport as argument passed from Main Application
module.exports = async function(passport) {
    var clientid = await getClientId();

    passport.use(new GoogleStrategy({
        consumerKey: clientid, //(needs to fetch from aws-ssm)
        consumerSecret: GOOGLE_CONSUMER_SECRET, //(needs to fetch from aws-ssm)
        callbackURL: "http://localhost:8080/auth/google/callback"
      },
      function(token, tokenSecret, profile, done) {
         return done(null,profile);
      }
    ));
}

主要应用:

app.js / 路由.js

const passport = require('passport');

// Pass passport as argument
let initPassport = require('./config/passport_init.js');
initPassport(passport)
    .then(() => {
        console.log('Passport Initialised successfully');

        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('/');
          });

    })
    .catch(err => console.log(err));
于 2019-06-20T04:10:26.967 回答