首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Strategy.OAuth2Strategy.parseErrorResponse - NodeJS护照错误

Strategy.OAuth2Strategy.parseErrorResponse - NodeJS护照错误
EN

Stack Overflow用户
提问于 2018-07-07 18:55:04
回答 6查看 9.9K关注 0票数 7

我试图使用护照和谷歌护照将谷歌身份验证嵌入到Node.js中- google 20。问题是,当google回调路径打开时,我得到:

代码语言:javascript
复制
Error
at Strategy.OAuth2Strategy.parseErrorResponse (E:\Programowanie\NodeJS\Hydronide\node_modules\passport-oauth2\lib\strategy.js:329:12)
at Strategy.OAuth2Strategy._createOAuthError (E:\Programowanie\NodeJS\Hydronide\node_modules\passport-oauth2\lib\strategy.js:376:16)
at E:\Programowanie\NodeJS\Hydronide\node_modules\passport-oauth2\lib\strategy.js:166:45
at E:\Programowanie\NodeJS\Hydronide\node_modules\oauth\lib\oauth2.js:191:18
at passBackControl (E:\Programowanie\NodeJS\Hydronide\node_modules\oauth\lib\oauth2.js:132:9)
at IncomingMessage.<anonymous> (E:\Programowanie\NodeJS\Hydronide\node_modules\oauth\lib\oauth2.js:157:7)
at emitNone (events.js:110:20)
at IncomingMessage.emit (events.js:207:7)
at endReadableNT (_stream_readable.js:1059:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)

我(或多或少)跟随本教程。这是我的代码:路由(从‘/auth’开始)

代码语言:javascript
复制
'use strict'

const passport = require('passport')
const router = require('express').Router()

router.get(
  '/google',
  (req, res, next) => {
    if (req.query.return) {
      req.session.oauth2return = req.query.return
    }
    next()
  },
  passport.authenticate('google', { scope: ['email', 'profile'] })
)

router.get(
  '/google/callback',
  passport.authenticate('google'),
  (req, res) => {
    const redirect = req.session.oauth2return || '/';
    delete req.session.oauth2return;
    res.redirect(redirect);
  }
);

module.exports = router

护照配置如下:

代码语言:javascript
复制
'use strict'
const passport = require('passport')
const keys = require('./keys')
const GoogleStrategy = require('passport-google-oauth20').Strategy
const userController = require('../controllers/user-controller')

const passportConfig = {
  clientID: keys.google.clientId,
  clientSecret: keys.google.clientSecret,
  callbackURL: 'auth/google/callback',
  accessType: 'offline'
}

passport.use(new GoogleStrategy(passportConfig,
  (accessToken, refreshToken, profile, done) => {
  console.log(accessToken, refreshToken, profile, done)
  userController.getUserByExternalId('google', profile.id)
  .then(user => {
    if (!user) {
      userController.createUser(profile, 'google')
      .then(user => {
        return done(null, user)
      })
      .catch(err => {
        return done(err)
      })
    }
    return done(null, user)
  })
  .catch(err => {
    return done(err)
  })
}))

passport.serializeUser((user, cb) => {
  cb(null, user)
})
passport.deserializeUser((obj, cb) => {
  cb(null, obj)
})

如您所见,我在新的console.log第二个参数函数中添加了GoogleStrategy,但它从不触发。

//编辑我注意到,没有分配require('passport-google-oauth20').Strategy,而是使用了require('passport-google-oauth20')。但是修复它不会改变任何事情,仍然是相同的错误。我能补充一个问题的是,在我的主要失败中,我会调用

代码语言:javascript
复制
// sets passport config
require('./config/jwt-auth')
require('./config/google-auth')

// initialize passport
app.use(passport.initialize())

所以我不认为里面会有什么问题。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-04-18 08:19:59

您必须在策略的callbackURL部分中指定完整的url :例如:当代码在localhost:3000上本地运行时,如下所示:

代码语言:javascript
复制
passport.use(new googleStrategy({
    clientID:keys.clientID,
    clientSecret:keys.clientSecret,
    callbackURL:'auth/google/callback'
},(accessToken,refreshToken, profile,done)=>{
    console.log(accessToken);
    console.log(refreshToken);
    console.log(profile);
}
));

app.get('/auth',passport.authenticate('google',{

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

上面的代码肯定会抛出一个TokenError:坏请求。必须传递完整的URl才能得到如下所示的最终代码:

代码语言:javascript
复制
passport.use(new googleStrategy({
    clientID:keys.clientID,
    clientSecret:keys.clientSecret,
    callbackURL:'http://localhost:3000/auth/google/callback'
},(accessToken,refreshToken, profile,done)=>{
    console.log(accessToken);
    console.log(refreshToken);
    console.log(profile);
}
));

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

app.get('/auth/google/callback', 
  passport.authenticate('google'));
票数 8
EN

Stack Overflow用户

发布于 2018-07-10 09:25:39

您可以通过在Oauth和策略中放置一些console.log在节点模块下获得帮助,特别是在日志中出错的行周围。

代码语言:javascript
复制
E:\Programowanie\NodeJS\Hydronide\node_modules\passport-oauth2\lib\strategy.js
E:\Programowanie\NodeJS\Hydronide\node_modules\oauth\lib\oauth2.js

这将帮助您获得解析错误的根本原因。似乎请求/响应数据存在一些问题。

票数 2
EN

Stack Overflow用户

发布于 2020-07-15 09:43:25

我通过检查这条路线解决了这个问题

代码语言:javascript
复制
app.get('/auth',passport.authenticate('google',{
    scope:['profile','email']
}));

我试图对新用户做些什么,为此,我试图从数据库中获取用户,如果我得到了,我将完成这项工作,否则只需重定向到某个地方,但我面临的问题是,您可以通过控制日志来检查这个路由。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51226112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档