在开发node.js的介绍性book的最后一个示例时(使用Google OpenID验证策略的express.js应用程序),替换passport-google
软件包后 (4月20日就过时了,2015) 使用passport-google-oauth2
包(Google OAuth 2.0的认证策略)并遵循its documentation's page和example here的指示;我在选择Google+账号后遇到了下面的错误,这个错误是由oath2.js
模块抛出的,具体是在userProfile(accessToken, done)
方法中调用this._oauth2.get("https://www.googleapis.com/plus/v1/people/me",...)
。相关的源代码和模块依赖如下。
问题的根源可能是什么?
具体错误为:
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.0.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
9条答案
按热度按时间7z5jn7bk1#
我只是幸运地在jaredhanson/passport-google-oauth上发现了一个类似的问题,这给了我一个想法去Google's project console并简单地启用
Google+ API
,它是“关闭的”(哦,我!!,他的第一个基于Google+的应用程序的天真开发者)。这是问题的根源。我再次尝试,oauth2
开始正确地接收配置文件。8yparm6h2#
您正在使用的
scope
现已弃用:相反,我们必须使用以下方法:
您还可以获得
profile scope
:5f0d552i3#
我使用的是Google OAuth 2.0 Playground,在我的情况下,这个错误的原因是我的令牌已经过期。在Playground中刷新令牌解决了这个问题。
ki1q1bka4#
我发现了同样的错误,我解决了它这样做:
在package.json中,将“passport”值更改为“^0.4.0”,将“passport-google-oauth”值更改为“^2.0.0”。再次运行“npm安装”。
hof1towb5#
经过一番研究,我的案例中问题的根本原因是我最初使用
而不是使用
Screenshot
afdcj2ne6#
当我把我的包从
passport-google-oauth
改成passport-google-oauth20
时,一切都开始正常工作。vd8tlhqk7#
如果用户不在
Test Users
列表中(在Google's project console中的OAuth consent screen
下),则在登录未发布的OAuth应用时也会引发此错误。qacovj5a8#
在我的例子中,错误
"Failed to fetch user profile"
是由祖父库node-oauth
中的一个bug引起的,具体来说,它是一个双回调处理。https://github.com/jaredhanson/passport-google-oauth2/issues/87
这些库
passport-google-oauth2
,node-oauth
都很旧了,维护得也不好,我不想在GitHub上玩我自己的fork,我很快就用package patch
的方法修复了它。https://dev.to/zhnedyalkow/the-easiest-way-to-patch-your-npm-package-4ece
我如何使用
patch-package
为node-oauth
库应用补丁:1.安装
patch-package
库。1.使用以下代码修补
node_modules/oauth/lib/oauth2.js
:1.运行
npx patch-package node-oauth
。1.将补丁文件提交到我的git仓库。
neekobn89#
我也面临着同样的问题!解决方案:内部
passport.use(新的Google战略({客户ID:“特定值”,客户端密码:“另一个特定值”,回调URL:“http://127.0.0.1:3000/auth/google/callback“,回调请求密码:真,*****************************},
在带星号的行上添加此链接“https://www.googleapis.com/oauth2/v3/userinfo“最终代码将如下所示passport。使用(new GoogleStrategy({ clientID:谷歌客户端ID,客户端机密:.谷歌客户端机密,回调URL:“http://localhost:3000/auth/google/secrets”,passReqToCallback:真,用户资料URL:“https://www.googleapis.com/oauth2/v3/userinfo“},希望这样能解决问题!