使用策略护照贝宝:未能获得访问令牌
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);
));
【讨论】:
这个函数永远不会被调用...这是问题所在。以上是关于使用策略护照贝宝:未能获得访问令牌的主要内容,如果未能解决你的问题,请参考以下文章