使用策略护照贝宝:未能获得访问令牌

Posted

技术标签:

【中文标题】使用策略护照贝宝:未能获得访问令牌【英文标题】:Using strategy passport paypal : failed to obtain access token 【发布时间】:2016-07-29 14:55:06 【问题描述】:

护照(Jared Hanson),

如何通过 openID 或 OAuth 使用 Paypal?

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

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

http://localhost:4000/api/users/signin/paypal

http://localhost:4000/api/users/signin/paypal/callback

我的贝宝端点:

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('.. 
);

我的贝宝策略:

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测试过

改为http://localhost:4000/api/users/signin/paypal

【问题讨论】:

我同样的问题,我尝试使用passport-paypal,passport-paypal-openidconnect,但它不起作用.. 不确定是否能解决您的问题,但 callbackUrl 应包含 localhost:4000 没有Molda,我的callbackURL已经包含localhost:4000:这是客户端凭据定义期间护照策略的问题。 【参考方案1】:

我是分叉和维护 openid-connect 包的人

tokenURL 应该是 openidconnect url 而不是 oauth2 令牌 url...

你可以省略 tokenURL 和 authorizationURL,只使用 sandbox: true (我不能代表passport-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);
));

【讨论】:

顺便说一句,以防人们想知道正确的 url 是什么,openidconnect 令牌应该使用 /v1/identity/openidconnect/tokenservice 而不是 /v1/oauth2/token @dA3m0n 啊,但实际上这确实不是插件的问题,部分原因是 paypal 的文档,oauth2 url 似乎不再起作用,openid-connect url 也不起作用旧的,只要使用正确的网址,插件就可以工作...... 基本上,passport-paypal 似乎不起作用(我可能错了,它对我不起作用,这就是我分叉并编写“openidconnect”版本的原因),passport-paypal-openidconnect 工作,只要当您提供正确的网址时(或者您根本不提供,默认行为会起作用,对于沙箱,只需提供“沙箱:真”)【参考方案2】:

我不知道它是否会解决问题,但是如果可以,应该在回调中调用 done 函数并使用 true 值。

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);
 ));

【讨论】:

这个函数永远不会被调用...这是问题所在。

以上是关于使用策略护照贝宝:未能获得访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 laravel 护照自定义访问令牌

用于生成的 Laravel 护照令牌

Laravel 护照延长访问令牌过期时间

laravel 5.3 护照和角度存储访问令牌

Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置

如何从贝宝配置文件中获取访问令牌