使用JavaScript进行DeviantArt Oauth身份验证

时间:2015-03-04 15:44:38

标签: javascript ajax authentication oauth oauth-2.0

我正在尝试通过JavaScript获取Oauth访问令牌。在partilar中,我想对DeviantArt API进行身份验证,尽可能保持简单。这是我的方法,我只需要一个,但任何人都在工作,所以只需一个解决方案就足够了。

  1. 因为它是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);
    });
    
  2. 问题是我总是得到以下错误

      

    Uncaught SyntaxError:意外的令牌:

    但是点击JavasCript控制台中的错误我可以看到响应JSON:

    {"access_token":"662b..5d58","token_type":"Bearer","expires_in":3600,"status":"success"}
    

    并且Concole.log打印Error: [object Object](尽管chrome控制台不会在该行中引发任何错误)。

    1. 我也尝试使用库JSO,但我也没有实现保存令牌。

    2. 我也尝试过使用Hello.js库,但它不支持DeviantArt,我修改它的方法没有任何成功。

    3. 我还试图修改XMLHttpRequest()中的标题或者向getJson添加选项,但无论我尝试什么,都会出现CORS错误。

    4. 我一直在尝试在stackoverflow上发布的数十个解决方案,但没有人适合我:(

1 个答案:

答案 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