node.js の紹介 book (Google OpenIDによる認証戦略を使用した express.js アプリケーション)の最後の例を開発している間、 _passport-google
_パッケージ(2015年4月20日に廃止)を_passport-google-oauth2
_パッケージ(Googleによる認証戦略OAuth 2.0)および そのドキュメントのページ および ここの例 の指示に従いました。 _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 ^^ *****/
_
アプリケーションには次の依存関係があります。
[email protected] ├─┬[email protected] │├─┬[email protected] │││──ms @ 0.7.0 │└──[email protected] ├─┬[email protected] │├──[email protected] │└──[email protected] ├─┬[email protected] │├──[email protected] │├─ ┬[email protected] │││──[email protected] │├─┬[email protected] ││├──[email protected] │││──[email protected] ││├──[email protected] ││├──[email protected] ││└──[email protected] │├──[email protected] │├──[email protected] │├─┬デバッグ@ 2.1.3 │││──[email protected] │├──[email protected] │├──[email protected] │├──[email protected] │├──[email protected] │└─┬[email protected] │└── [email protected] ├─┬[email protected] │├──[email protected] │├──[email protected] │├──[email protected] │├─┬[email protected] │││───[email protected] │├ ──[email protected] │├──[email protected] │├ ──[email protected] │├─┬[email protected] │││──[email protected] ││└── [email protected] │└──[email protected] ├─┬[email protected] │├──basic-auth @ 1.0.0 │├─┬[email protected] ││└──[email protected] │├──[email protected] │└─┬[email protected] │└──[email protected] ├─┬[email protected] │└─ ─[email protected] ├─┬[email protected] │├──[email protected] │└──[email protected] ├─┬[email protected] │└─┬[email protected] │├──[email protected] │├──[email protected] │└──[email protected] ├──[email protected] ├──[email protected] .6 └─┬[email protected] ├──[email protected] ├──[email protected] ├──[email protected] ├─┬[email protected] │├──[email protected] │└─┬組み合わせた- [email protected] │└──[email protected] ├─┬[email protected] │├──[email protected] │├──暗号[email protected] │├──[email protected] │└──[email protected] ├─┬[email protected] │├──[email protected] │├──[email protected] │└──[email protected] ├── [email protected] ├──[email protected] ├──[email protected] ├──[email protected] .0 ├──[email protected] └──[email protected]
幸運にも、 jaredhanson/passport-google-oauth で同様の問題を見つけたため、に移動して Googleのプロジェクトコンソール とGoogle+ API
、「オフ」になりました(Google+に基づく彼の最初のアプリケーションの素朴な開発者)。それが問題の原因でした。私はもう一度試してみましたが、oauth2
がプロファイルの受信を正しく開始しました。
使用している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' ]
}));
私はGoogle OAuth 2.0 Playgroundを使用していますが、私の場合、このエラーの理由は、トークンの有効期限が切れたためです。Playgroundでトークンを更新すると問題が解決しました。
私は同じエラーを見つけ、これを実行して解決しました:
Package.jsonで、「passport」の値を「^ 0.4.0」に、「passport-google-oauth」を「^ 2.0.0」に変更します。 「npm install」を再度実行します。