使用 JavaScript 的基本身份验证
Basic Authentication Using JavaScript
我正在构建一个使用 Caspio API 的应用程序。我在针对他们的 API 进行身份验证时遇到了一些问题。我花了 2-3 天的时间试图解决这个问题,但这可能是由于我的一些理解。我已经阅读了无数关于 Whosebug post 和其他方面的文章,但没有解决问题。下面是我的解决方案的代码示例,基于我所查看的内容,我收到了 400 状态代码消息;我在这里做错了什么? (请提供注释良好的代码示例,我更希望 NOT 有链接 posted 在这里引用其他 material 因为我已经广泛地研究了这些。谢谢!) :
我看过的一些参考资料:
1)
2)
我想使用下面 caspio 描述的身份验证方法:
作为在请求中包含凭据的替代方法 body,客户端可以使用 HTTP 基本身份验证方案。在这种情况下,身份验证请求将按以下方式设置:
方法: POST
URL: 你的令牌端点
Body: grant_type=client_credentials
Header参数:
授权:基本基本认证领域
下面是我的 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();" />
在花了很多时间研究这个之后,我想出了解决方案;在此解决方案中,我没有使用基本身份验证,而是使用了 oAuth 身份验证协议。但是要使用基本身份验证,您应该能够在 "setHeaderRequest" 中指定它,而对代码示例的其余部分进行最少的更改。我希望这能在将来帮助其他人:
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 成功发出经过身份验证的请求。我相信还有很多缺陷...
EncodedParams 变量被重新定义为 params 变量将不起作用。您需要对变量进行相同的预定义调用,否则看起来可能需要做更多的工作。干杯! json 没有在 php 中发挥其全部功能,有更好的方法调用 json,我现在不记得了。
今天我们使用 Bearer token
比 Basic Authentication
更频繁,但如果您想先使用 Basic Authentication
来获取 Bearer 令牌,那么有两种方法:
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()
完整语法为 here
第二种方法使用 Ajax:
$.ajax
({
type: "GET",
url: "abc.xyz",
dataType: 'json',
async: false,
username: "username",
password: "password",
data: '{ "key":"sample" }',
success: function (){
alert('Thanks for your up vote!');
}
});
希望这能为您提供从何处开始使用 JS 进行 API 调用的提示。在 Angular、React 等框架中,有更强大的方法可以使用 Basic Authentication
或 Oauth Authentication
进行 API 调用。只是探索它。
将用户名、密码、token_ 和密钥变量的 var 更改为 const。
我正在构建一个使用 Caspio API 的应用程序。我在针对他们的 API 进行身份验证时遇到了一些问题。我花了 2-3 天的时间试图解决这个问题,但这可能是由于我的一些理解。我已经阅读了无数关于 Whosebug post 和其他方面的文章,但没有解决问题。下面是我的解决方案的代码示例,基于我所查看的内容,我收到了 400 状态代码消息;我在这里做错了什么? (请提供注释良好的代码示例,我更希望 NOT 有链接 posted 在这里引用其他 material 因为我已经广泛地研究了这些。谢谢!) :
我看过的一些参考资料:
1)
2)
我想使用下面 caspio 描述的身份验证方法:
作为在请求中包含凭据的替代方法 body,客户端可以使用 HTTP 基本身份验证方案。在这种情况下,身份验证请求将按以下方式设置:
方法: POST
URL: 你的令牌端点
Body: grant_type=client_credentials
Header参数:
授权:基本基本认证领域
下面是我的 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();" />
在花了很多时间研究这个之后,我想出了解决方案;在此解决方案中,我没有使用基本身份验证,而是使用了 oAuth 身份验证协议。但是要使用基本身份验证,您应该能够在 "setHeaderRequest" 中指定它,而对代码示例的其余部分进行最少的更改。我希望这能在将来帮助其他人:
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 成功发出经过身份验证的请求。我相信还有很多缺陷...
EncodedParams 变量被重新定义为 params 变量将不起作用。您需要对变量进行相同的预定义调用,否则看起来可能需要做更多的工作。干杯! json 没有在 php 中发挥其全部功能,有更好的方法调用 json,我现在不记得了。
今天我们使用 Bearer token
比 Basic Authentication
更频繁,但如果您想先使用 Basic Authentication
来获取 Bearer 令牌,那么有两种方法:
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()
完整语法为 here
第二种方法使用 Ajax:
$.ajax
({
type: "GET",
url: "abc.xyz",
dataType: 'json',
async: false,
username: "username",
password: "password",
data: '{ "key":"sample" }',
success: function (){
alert('Thanks for your up vote!');
}
});
希望这能为您提供从何处开始使用 JS 进行 API 调用的提示。在 Angular、React 等框架中,有更强大的方法可以使用 Basic Authentication
或 Oauth Authentication
进行 API 调用。只是探索它。
将用户名、密码、token_ 和密钥变量的 var 更改为 const。