我正在尝试通过JavaScript获取Oauth访问令牌。在partilar中,我想对DeviantArt API进行身份验证,尽可能保持简单。这是我的方法,我只需要一个,但任何人都在工作,所以只需一个解决方案就足够了。
因为它是Cross-Origin我尝试使用ajax。这是代码:
var response_type = "code";
var client_id = "1234"; //Random clientId for stackoverflow
var redirect_uri = "http://localhost:8080/my-project/authDeviantArt.html";
var authorization1 = "https://www.deviantart.com/oauth2/authorize";
var authorization2 = "https://www.deviantart.com/oauth2/token";
var client_secret = "qwerty12345"; //Random secret for stackoverflow
var grant_type1 = "authorization_code";
var grant_type2 = "client_credentials";
var scopes = "basic";
//Using The Authorization Code Grant
var request1 = authorization1+'?response_type='+response_type+'client_id='+client_id+'&redirect_uri='+redirect_uri;
//Using The Client Credentials Grant
var request2 = authorization2+'?client_id='+client_id+'&client_secret='+client_secret+'&grant_type='+grant_type2;
$.ajax({
url: request1,
dataType: "jsonp",
success: function (res){
console.log("Response: "+res.access_token);
});
问题是我总是得到以下错误
Uncaught SyntaxError:意外的令牌:
但是点击JavasCript控制台中的错误我可以看到响应JSON:
{"access_token":"662b..5d58","token_type":"Bearer","expires_in":3600,"status":"success"}
并且Concole.log打印Error: [object Object]
(尽管chrome控制台不会在该行中引发任何错误)。
我也尝试使用库JSO,但我也没有实现保存令牌。
我也尝试过使用Hello.js库,但它不支持DeviantArt,我修改它的方法没有任何成功。
我还试图修改XMLHttpRequest()中的标题或者向getJson添加选项,但无论我尝试什么,都会出现CORS错误。
我一直在尝试在stackoverflow上发布的数十个解决方案,但没有人适合我:(
答案 0 :(得分:2)
我在尝试获取一个简单的客户端访问令牌时遇到了类似的问题,我得出的结论是 Deviantart API根本不支持CORS 。我不是100%肯定,但我没有尝试(通过ajax或XMLHttpRequest或甚至test-cors.org)给出任何指示响应包含正确的CORS头(Access-Control-Allow-Origin)。
这也是有意义的。这种使用API的方法迫使您在JS代码中公开您的客户机密码(如您的示例中所示)。我认为API旨在用于后端或程序(桌面或移动),这些程序会在其代码或某些加密配置文件中隐藏其客户机密。 This comment在另一个问题上让我得出了这个结论。
我建议您尽可能处理API通信服务器端。您可能还想查看their oEmbed implementation。