使用paypal的战略护照:未能获得访问令牌

护照(Jared Hanson)

我如何使用贝宝与openID或OAuth?

我正在使用Passport-paypal-oauth策略( https://github.com/jaredhanson/passport-paypal-oauth ),

注意:我的路线以localhost:4000 / api / users开头

  • HTTP://本地主机:4000 / API /用户/登入/贝宝

  • HTTP://本地主机:4000 / API /用户/登入/贝宝/callback

我的PayPal终点:

var passport_paypal = require('../middlewares/passport-paypal'); router.get('/signin/paypal', passport_paypal.authenticate('paypal-signin', { scope: 'openid profile email'})); router.get('/signin/paypal/callback', function(req, res, next){ passport_paypal.authenticate('paypal-signin', function(err, user, info){ // Handle cases //return res.status(xxx).json('.. }); 

我的Paypal策略:

 var PaypalStrategy = require('passport-paypal-oauth').Strategy; passport.use('paypal-signin', new PaypalStrategy({ clientID : "MY APP ID", clientSecret : "MY APP SECRET", callbackURL : "http://localhost:4000/api/users/signin/paypal/callback", tokenURL : "https://api.sandbox.paypal.com/v1/oauth2/token", authorizationURL : "https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize" }, function(token, refreshToken, profile, done) { !!!!! Not called ... // Get user profie // Save in db or other handling })); 

问题:当我呼叫http:// localhost:4000 / api / users / signin / paypal时 ,我在浏览器中得到以下答案:

  [InternalOAuthError: failed to obtain access token] name: 'InternalOAuthError', message: 'failed to obtain access token', oauthError: { statusCode: 400, data: '{"error":"invalid_client","error_description":"Client credentials are missing"}' } } 

function(token, refreshToken, profile, done) {永远不会被调用。

哪里不对 ?


我已经使用http://127.0.0.1:4000/api/users/signin/paypal进行了testing

而不是http:// localhost:4000 / api / users / signin / paypal

我是分叉和维护openid连接包的人

tokenURL应该是openidconnecturl,而不是oauth2令牌url …

您可以省略tokenURL和authorizationURL,只使用沙箱:true(我不能说护照paypal,我忘了它是否有内置)

 passport.use('paypal-signin', new PaypalStrategy({ clientID : "MY APP ID", clientSecret : "MY APP SECRET", callbackURL : "http://localhost:4000/api/users/signin/paypal/callback", sandbox: true }, function(token, refreshToken, profile, done) { // Get user profie // Save in db or other handling done(true); })); 

我不知道它是否能解决问题,但是如果可以的话,应该在callback中调用done函数。

 passport.use('paypal-signin', new PaypalStrategy({ clientID : "MY APP ID", clientSecret : "MY APP SECRET", callbackURL : "http://localhost:4000/api/users/signin/paypal/callback", tokenURL : "https://api.sandbox.paypal.com/v1/oauth2/token", authorizationURL : "https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize" }, function(token, refreshToken, profile, done) { // Get user profie // Save in db or other handling done(true); }));