将Google功能与Node-express-passport结合使用

时间:2019-01-08 12:25:15

标签: node.js firebase express google-cloud-functions passport.js

我使用过护照passport发策略,因此在执行策略时,我无法在客户端看到护照登录窗口

所以这就是我最初要做的

class Auth extends ParentClass {
  constructor(context, options) {
    super() 
    this.app.get('/callback/:service', (req, res) => 
    this.callbackEndpoint(req,res))
    this.app.get('/', (req, res, next) => this.loginEndpoint(req, res, next))
}

  async loginEndpoint (req, res, next) {
      if (req.query.Twitter) {
        console.log(`Inside Twitter Authentication`)
        passport.authenticate('twitter', { scope : ['email'] })(req,res,next);
      }

}

在我的ParentClass中,我正在或多或少地初始化东西

class ParentClass {
   this.use(corsMiddleware(options.CORS_URLS))
    this.use(bodyParser.json())
    this.use(session({
      secret: 'keyboard cat',
      resave: false,
      saveUninitialized: true,
      cookie: { secure: true }
    }))
    this.use(passport.initialize())
    this.use((passport.session()))
}

use (middleware) {
    this.app.use(middleware)
  }
}

最后,这是我的护照策略

passport.use(new TwitterStrategy({
    consumerKey: functions.config().twitterCredentials.apikey,
    consumerSecret: functions.config().twitterCredentials.apiSecretKey,
    callbackURL: redirect_uri,
    passReqToCallback: true
  }, async (req, accessToken, refreshToken, params, profile, done) => {
      console.log(`logging from Passport Twitter ${req.workspace, req.accessToken}`)
        done()
}))

在第一个代码段中,我看到了日志Inside Twitter Authentication,但是此后什么也没有发生。

我期望什么?一个显示给我登录Twitter的窗口,但未显示任何内容,一段时间后,我在控制台信息中得到了这个信息:Execution took 569847 ms, finished with status: 'timeout'

所以这是我的问题: 1.我们可以在Google函数中使用护照和正常的oauth流吗? (如果没有回答,请发表评论) 2.如果是,我们可以在上面的代码中使用该错误。

更新说明:在搜寻我的问题时,我偶然发现了这个老问题,并意识到虽然它有些相似,但对前一个问题的描述却非常模糊。我今天晚些时候问了一个类似的问题,但决定将其与这个问题合并。

1 个答案:

答案 0 :(得分:1)

在代码的第一部分,您需要将passport.authenticate直接传递给get处理程序。像这样:

class Auth extends ParentClass {
  constructor(context, options) {
    super() 
    this.app.get('/callback/:service', (req, res) => 
    this.callbackEndpoint(req,res))
    this.app.get('/', passport.authenticate('twitter', { scope : ['email'] })(req,res,next))
  }
}

我认为此“应用程序”已安装在/ auth / twitter之类的路径上

在前端,您将打开一个弹出窗口,其URL指向/ auth / twitter。像这样:

<button onclick="oauthPrompt('twitter')">Login with Twitter</button>
<script>
    function oauthPrompt(service) {
      const url = '/auth/' + service
      var newWindow = window.open(url, 'name', 'height=600,width=450')
      if (window.focus) {
        newWindow.focus();
      }
    }

</script>