Node.js“passport-google-oauth2”在Express应用程序中传递“未能获取用户configuration文件”错误

在开发node.js入门书 (一个使用Google OpenIDauthentication策略的express.js应用程序)的最后一个例子时,在将passport-google(在2015年4月20日过期)replace为passport-google-oauth2软件包(Google OAuth 2.0authentication策略),并遵循其文档页面上的说明和示例 。 select了oath2.js模块抛出的Google+帐号后,我得到了以下错误,具体调用this._oauth2.get("https://www.googleapis.com/plus/v1/people/me",...)userProfile(accessToken, done)方法中。 下面是相关的源代码和模块依赖关系。

什么可能是问题的根源?

具体的错误是:

 InternalOAuthError: failed to fetch user profile at <...>\web-app\b4\node_modules\passport-google-oauth2\lib\oauth2.js:92:28 at passBackControl (<...>\web-app\b4\node_modules\passport-google-oauth2\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:124:9) at IncomingMessage.<anonymous> (<...>\web-app\b4\node_modules\passport-google-oauth2\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:143:7) at IncomingMessage.emit (events.js:129:20) at _stream_readable.js:908:16 at process._tickCallback (node.js:355:11) 

相关应用程序的代码是:

  passport = require('passport'), //... GoogleStrategy = require('passport-google-oauth2').Strategy; // #passport-google-oauth2 //... /***** #passport-google-oauth2 vv *****/ passport.use(new GoogleStrategy({ clientID: "a_specific_value", clientSecret: "another_specific_value", callbackURL: "http://127.0.0.1:3000/auth/google/callback", passReqToCallback:true }, function(request, accessToken, refreshToken, profile, done) { profile.identifier=profile.id; return done(null, profile); } )); /***** #passport-google-oauth2 ^^ *****/ //... /***** #passport-google-oauth2 vv *****/ app.get('/auth/google', passport.authenticate('google', { successRedirect: '/',scope: [ 'https://www.googleapis.com/auth/userinfo.email']}) ); app.get( '/auth/google/callback', passport.authenticate( 'google', { successRedirect: '/', failureRedirect: '/' })); /***** #passport-google-oauth2 ^^ *****/ 

该应用程序具有以下依赖项:

 b4@0.0.1
 ├─┬connect-redis@1.4.7
 │├─┬debug@2.1.3
 ││└──ms@0.7.0
 │└──redis@0.10.3
 ├─┬cookie-parser@1.3.4
 │├──cookie@0.1.2
 │└──cookie-signature@1.0.6
 ├─┬express@3.3.8
 │├──buffer-crc32@0.2.1
 │├─┬commander@1.2.0
 ││└──keypress@0.1.0
 │├─┬connect@2.8.8
 ││├──bytes@0.2.0
 ││├──formidable@1.0.14
 ││├──pause@0.0.1
 ││├──qs@0.6.5
 ││└──uid2@0.0.2
 │├──cookie@0.1.0
 │├──cookie-signature@1.0.1
 │├─┬debug@2.1.3
 ││└──ms@0.7.0
 │├──fresh@0.2.0
 │├──methods@0.0.1
 │├──mkdirp@0.3.5
 │├──range-parser@0.0.4
 │└─┬send@0.1.4
 │└──mime@1.2.11
 ├─┬express-session@1.11.1
 │├──cookie@0.1.2
 │├──cookie-signature@1.0.6
 │├──crc@3.2.1
 │├─┬debug@2.1.3
 ││└──ms@0.7.0
 │├──depd@1.0.1
 │├──on-headers@1.0.0
 │├──parseurl@1.3.0
 │├─┬uid-safe@1.1.0
 ││├──base64-url@1.2.1
 ││└──native-or-bluebird@1.1.2
 │└──utils-merge@1.0.0
 ├─┬morgan@1.5.2
 │├──basic-auth@1.0.0
 │├─┬debug@2.1.3
 ││└──ms@0.7.0
 │├──depd@1.0.1
 │└─┬on-finished@2.2.0
 │└──ee-first@1.1.0
 ├─┬npmlog@0.0.4
 │└──ansi@0.1.2
 ├─┬passport@0.2.1
 │├──passport-strategy@1.0.0
 │└──pause@0.0.1
 ├─┬passport-google-oauth2@0.1.6
 │└─┬passport-oauth2@1.1.2
 │├──oauth@0.9.12
 │├──passport-strategy@1.0.0
 │└──uid2@0.3.3
 ├──q@0.9.7
 ├──redis@0.8.6
 └─┬request@2.27.0
   ├──aws-sign@0.3.0
   ├──cookie-jar@0.3.0
   ├──forever-agent@0.5.2
   ├─┬form-data@0.1.4
   │├──async@0.9.0
   │└─┬combined-stream@0.0.7
   │└──delayed-stream@0.0.5
   ├─┬hawk@1.0.0
   │├──boom@0.4.2
   │├──cryptiles@0.2.2
   │├──hoek@0.9.1
   │└──sntp@0.2.4
   ├─┬http-signature@0.10.1
   │├──asn1@0.1.11
   │├──assert-plus@0.1.5
   │└──ctype@0.5.3
   ├──json-stringify-safe@5.0.0
   ├──mime@1.2.11
   ├──node-uuid@1.4.3
   ├──oauth-sign@0.3.0
   ├──qs@0.6.6
   └──tunnel-agent@0.3.0

幸运的是,在jaredhanson / passport-google-oauth上发现了一个类似的问题,这让我想到了Google的项目控制台 ,只是启用了被closuresGoogle+ API (哦,我是天真的开发者他的第一个基于Google+的应用程序)。 这是问题的根源。 我再次尝试, oauth2开始正确接收configuration文件。

您正在使用的scope现在已被弃用:

 passport.authenticate('google', { successRedirect: '/',scope: [ 'https://www.googleapis.com/auth/userinfo.email']}) ); 

相反,我们必须使用这个:

 passport.authenticate('google', { successRedirect: '/',scope: ['email'] })); 

您还可以获取profile scope

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