我正在努力将 eBay OAuth 集成到我的应用程序中以进行用户身份验证。我已成功导航 OAuth 流程的第一部分,在用户授权后从 eBay 获取授权代码。但是,当我尝试将此授权代码交换为访问令牌时遇到问题。
流程如下:
尽管按照记录的步骤向 eBay 的令牌交换端点发送 POST 请求,我还是遇到了以下错误:
{ "error": "401 未经授权", }
我的 POST 请求概要:
Content-Type
:application/x-www-form-urlencoded
Authorization
:使用我的 client_id 和 client_secret 进行基本身份验证grant_type
:授权码code
:【我收到的授权码】redirect_uri
:[我注册的重定向URI]执行的检查:
redirect_uri
与授权请求中使用的完全相同,并且已在我的 eBay 应用程序中注册。尽管采取了这些预防措施,代币交换还是失败了。我正在寻找有关可能出现问题的见解或建议。任何帮助将不胜感激。
有趣的是,当使用新的授权代码第二次尝试授权过程时,访问令牌的请求成功,并且我从 eBay 收到了有效的令牌。此行为是一致的:第一次尝试用授权代码交换访问令牌失败,但随后使用新代码的尝试会成功。我对这种不一致感到困惑,并且不确定为什么该过程仅适用于后续尝试。任何对此行为的见解或有关进一步调查领域的建议将受到高度赞赏。如果有特定的日志或调试策略可以帮助发现有关初始故障的更多细节,那么这些建议也将受到欢迎。
回调.js:
import axios from 'axios';
import qs from 'qs';
export default async function handler(req, res) {
if (req.method === 'GET') {
try {
const code = req.query.code;
// Obfuscated credentials for demonstration
const clientID = 'YOUR_CLIENT_ID';
const clientSecret = 'YOUR_CLIENT_SECRET';
const credentials = Buffer.from(`${clientID}:${clientSecret}`).toString('base64');
const authorizationHeader = `Basic ${credentials}`;
const response = await axios({
url: "https://api.sandbox.ebay.com/identity/v1/oauth2/token", // Sandbox URL
method: "post",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Authorization: authorizationHeader,
},
data: qs.stringify({
grant_type: "authorization_code",
code: code,
redirect_uri: "YOUR_REDIRECT_URI",
})
});
res.status(200).json(response.data);
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Error exchanging code for token' });
}
} else {
res.status(405).json({ error: 'Method not allowed' });
}
}
这确实是一个非常奇怪的行为。 您可以检查一下 eBay-API 是否有同样的问题。
import eBayApi from 'ebay-api';
const eBay = new eBayApi({
sandbox: true,
appId: clientID,
certId: clientSecret,
ruName: 'YOUR_REDIRECT_URI',
scope: ['https://api.ebay.com/oauth/api_scope']
});
const token = await eBay.OAuth2.getToken(code);
在生产中尝试您的代码可能是值得的。有时,沙盒环境会产生奇怪的响应。