Базовая аутентификация с использованием JavaScript
Я создаю приложение, которое использует API Caspio. У меня возникли проблемы с аутентификацией их API. Я потратил 2-3 дня, пытаясь понять это, но это может быть из-за некоторого понимания на моем конце. Я прочитал бесчисленные статьи о postoverflow post и в противном случае, но не решил проблему. Ниже приведен пример кода моего решения на основе того, на что я смотрел, и я получаю сообщение с кодом состояния 400; Что я здесь делаю неправильно? (Пожалуйста, укажите пример кода с комментариями, и я предпочел бы, чтобы НЕ имел ссылки, размещенные здесь, ссылаясь на другие материалы, так как я внимательно их рассмотрел. Спасибо!):
Некоторые ссылки, на которые я смотрел:
1) Чистый код JavaScript для базовой аутентификации HTTP?
2) Как сделать проверку подлинности HTTP в REST API вызовом из javascript
Я хотел бы использовать этот метод аутентификации, как описано ниже в caspio:
В качестве альтернативы включению учетных данных в тело запроса клиент может использовать базовую схему аутентификации HTTP. В этом случае запрос аутентификации будет настроен следующим образом:
Метод: POST
URL: Конечная точка маркера
Тело: 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();" />
Ответы
Ответ 1
Потратив немало времени на изучение этого вопроса, я нашел решение для этого; В этом решении я не использую обычную аутентификацию, а вместо этого использовал протокол аутентификации 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);
Если вы используете API-интерфейс Caspio REST для какого-либо запроса, вам может потребоваться закодировать параметры для определенного запроса к вашей конечной точке; см. документацию Caspio по этому вопросу;
ПРИМЕЧАНИЕ: кодированныйParams не используется в этом примере, но был использован в моем решении.
Теперь, когда у вас есть токен, сохраненный из конечной точки токена, вы сможете успешно пройти аутентификацию для последующего запроса от конечной точки ресурса 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...
}
}
}
Это решение рассматривает только то, как успешно выполнить аутентифицированный запрос с использованием Caspio API в чистом javascript. Я уверен, что есть еще много недостатков...
Ответ 2
Сегодня мы используем Bearer token
чаще, чем Basic 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()
Полный синтаксис здесь
Второй подход с использованием Ajax:
$.ajax
({
type: "GET",
url: "abc.xyz",
dataType: 'json',
async: false,
username: username,
password: password,
data: '{ "sample" }',
success: function (){
alert('Thanks for your up vote!');
}
});
Надеюсь, это даст вам подсказку, с чего начать с вызова API с JS. В таких фреймворках, как Angular 2+, React и т.д., Существует более эффективный способ вызова API с помощью Basic Authentication
или Oauth Authentication
. Просто исследуй это.
Ответ 3
Переменная EncodedParams переопределяется, поскольку переменная params не работает. У вас должен быть такой же предопределенный вызов переменной, в противном случае это выглядит возможным с немного большей работой. Ура! json не используется для своих полных возможностей в php, есть лучшие способы вызвать json, о котором я не помню в данный момент.