使用JavaScript进行基本验证

时间:2016-01-18 17:38:50

标签: javascript authentication xmlhttprequest

我正在构建一个消耗Caspio API的应用程序。我在对其API进行身份验证时遇到了一些问题。我花了2-3天试图解决这个问题,但这可能是由于对我的一些了解。我已经在stackoverflow帖子上阅读了无数文章,但没有解决问题。下面是我的解决方案的代码示例,基于我所看到的,我得到400状态代码消息;我在这做错了什么? (请提供评论良好的代码示例,我希望 NOT 在此处发布引用其他材料的链接,因为我已广泛查看这些内容。谢谢!):

我看过一些参考文献:

1)Pure JavaScript code for HTTP Basic Authentication?

2)How to make http authentication in REST API call from javascript

我想使用以下caspio所描述的身份验证方法:

作为在请求正文中包含凭据的替代方法,客户端可以使用HTTP基本身份验证方案。在这种情况下,将按以下方式设置身份验证请求:

方法: POST

网址: 您的令牌端点

正文: grant_type = client_credentials

标头参数:

授权: 基本身份验证领域

以下是我的Javascript和HTML代码。

JavaScript的:

var userName = "clientID";
var passWord = "secretKey";

function authenticateUser(user, password)
{
    var token = user + ":" + password;

    // Should i be encoding this value????? does it matter???
    // Base64 Encoding -> btoa
    var hash = btoa(token); 

    return "Basic " + hash;
}

function CallWebAPI() {

    // New XMLHTTPRequest
    var request = new XMLHttpRequest();
    request.open("POST", "https://xxx123.caspio.com/oauth/token", false);
    request.setRequestHeader("Authorization", authenticateUser(userName, passWord));  
    request.send();
    // view request status
    alert(request.status);
    response.innerHTML = request.responseText;
}

HTML:

<div>
<div id="response">

</div>
<input type="button" class="btn btn-primary" value="Call Web API" onclick="javascript:CallWebAPI();" />

4 个答案:

答案 0 :(得分:6)

花了相当多的时间研究这个,我想出了解决方案;在此解决方案中,我不使用基本身份验证,而是使用oAuth身份验证协议。但是要使用基本身份验证,您应该能够在&#34; setHeaderRequest&#34;中指定它。对代码示例的其余部分进行最小的更改。我希望将来可以帮助其他人:

var token_ // variable will store the token
var userName = "clientID"; // app clientID
var passWord = "secretKey"; // app clientSecret
var caspioTokenUrl = "https://xxx123.caspio.com/oauth/token"; // Your application token endpoint  
var request = new XMLHttpRequest(); 

function getToken(url, clientID, clientSecret) {
    var key;           
    request.open("POST", url, true); 
    request.setRequestHeader("Content-type", "application/json");
    request.send("grant_type=client_credentials&client_id="+clientID+"&"+"client_secret="+clientSecret); // specify the credentials to receive the token on request
    request.onreadystatechange = function () {
        if (request.readyState == request.DONE) {
            var response = request.responseText;
            var obj = JSON.parse(response); 
            key = obj.access_token; //store the value of the accesstoken
            token_ = key; // store token in your global variable "token_" or you could simply return the value of the access token from the function
        }
    }
}
// Get the token
getToken(caspioTokenUrl, userName, passWord);

如果您在某些请求中使用Caspio REST API,则必须对参数进行编码以针对您的端点发出特定请求;请参阅Caspio关于此问题的文档;

注意:在此示例中未使用encodedParams,但在我的解决方案中使用了。

现在您已经从令牌端点存储了令牌,您应该能够成功验证来自应用程序的caspio资源端点的后续请求

function CallWebAPI() {
    var request_ = new XMLHttpRequest();        
    var encodedParams = encodeURIComponent(params);
    request_.open("GET", "https://xxx123.caspio.com/rest/v1/tables/", true);
    request_.setRequestHeader("Authorization", "Bearer "+ token_);
    request_.send();
    request_.onreadystatechange = function () {
        if (request_.readyState == 4 && request_.status == 200) {
            var response = request_.responseText;
            var obj = JSON.parse(response); 
            // handle data as needed... 

        }
    }
} 

此解决方案仅考虑如何在纯JavaScript中使用Caspio API成功进行经过身份验证的请求。我确信还有很多瑕疵......

答案 1 :(得分:1)

今天,我们Bearer tokenBasic Authentication更经常使用Basic Authentication,但是如果您想先让const request = new XMLHttpRequest(); request.open('GET', url, false, username,password) request.onreadystatechange = function() { // D some business logics here if you receive return if(request.readyState === 4 && request.status === 200) { console.log(request.responseText); } } request.send() 来获得Bearer令牌,那么有几种方法:

$.ajax
({
  type: "GET",
  url: "abc.xyz",
  dataType: 'json',
  async: false,
  username: username,
  password: password,
  data: '{ "sample" }',
  success: function (){
    alert('Thanks for your up vote!');
  }
});

完整语法为here

使用Ajax的第二种方法:

Basic Authentication

希望这为您提供了从JS进行API调用开始的提示。在Angular 2 +,React等框架中,有更强大的方法可以使用Oauth Authentication或{{1}}进行API调用。只是探索它。

答案 2 :(得分:-3)

将用户名、密码、token_ 和密钥变量的 var 更改为 const。

答案 3 :(得分:-4)

重新定义了EncodedParams变量,因为params变量不起作用。您需要对变量进行相同的预定义调用,否则看起来可能需要更多工作。干杯! json不习惯它在php中的全部功能有更好的方法来调用json,我现在不记得了。