Добавляем заголовки для извлечения, решаем коры, запускаем клиентскую часть cryptojs - PullRequest
0 голосов
/ 02 июня 2019

Я работаю над проектом, в котором мне сначала нужно получить токен аутентификации с сервера.

Для этого мне нужно отправить GET-запрос на сервер авторизации с двумя парами ключ-значение, включенными в заголовок: 1 / идентификатор клиента (const) и 2 / вычисленное значение HMAC SHA1 на основе идентификатора клиентаотметка времени и так далее.

Это нормально работает с почтальоном.(Я вычисляю sha1 на онлайн-калькуляторе)

Задача 1: (сторона клиента cryptojs) В качестве приложения для узла я включил библиотеку cryptojs, и вычисления выполняются.Но даже с RequireJS я не могу заставить cryptojs работать в браузере.

Error: Module name "crypto-js" has not been loaded yet for context: _. Use require([])

Проблема 2: (cors)

Видимо, Chrome отказывается от соединения, так как сервер не принимает все входящие соединения,Добавление режима: «no-cors» в запросе на выборку не решает проблему.

Проблема 3: (заголовки)

Мне нужно добавить две пары ключ-значение в заголовки запроса get.В почтальоне это не проблема, но я не уверен, что это работает с добавлением или просто добавлением их в мои заголовки: {}

Я постоянно получаю сообщение об ошибке сервера, как будто нет добавленных заголовков.

Я уже пробовал REquireJS для решения проблемы cryptojs.

Я добавил заголовки в объект myHeaders

const myHeaders = new Headers();
myHeaders.append('ClientID', CLIENTID);
myHeaders.append('Clientsecret', hashedToken);

, а также только что добавил значения в:

headers: {
...
'ClientID': CLIENTID,
'Clientsecret': hashedToken,
}

Оба, похоже, не помогают.

Мой код:

function getToken(){

hashedToken = getHashedSecret();  //this won't work client side as    cryptojs can not be loaded
const CLIENTID = "CLIENTID";
const AUTHURL =  "https://authorization.server.com/api/CLIENTID/authorization/";
var TIMESTAMP = getTimeStamp();


const myHeaders = new Headers();
//  myHeaders.append('Content-Type', 'application/json');
myHeaders.append('ClientID', CLIENTID);
myHeaders.append('Clientsecret', hashedToken);
 console.log(myHeaders);
let response = fetch(AUTHURL+TIMESTAMP, {
  method: 'GET',
  headers: {
    myHeaders,
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'Origin': '',
    'Host': 'authorization.server.com',
    include: 'ClientID', CLIENTID

  },
  mode: 'no-cors',
 })
  .then(response => response.json())
  .then(data => {
    console.log(data);
    document.getElementById('output').innerHTML = data;
  })
  .catch(error => console.error(error))
console.log('data');
return data;
}

Я должен получить токен с сервера

1 Ответ

1 голос
/ 02 июня 2019

Похоже, что https://authorization.server.com не разрешает доступ от источника вашей страницы.Помните, что в браузерах политика Same Origin запрещает сценариям одного источника запрашивать информацию из других источников по умолчанию.(postman, не являясь браузером, не подпадает под это ограничение).Это связано с тем, что сценарии на сайте A (злоумышленник) не могут украсть вашу личную информацию с сайта B (возможно, через ваш интернет-банк), отправляя запросы (от вашего браузера, то есть с вашей информацией для аутентификации) на сайт B.

Чтобы это работало, сервер код на https://authorization.server.com должен будет отвечать на запросы браузера, используя Cross-Origin Resource Sharing , чтобы разрешить доступ от вашего источника.Вы не можете сделать это из своего клиентского кода (по понятным причинам).

Кроме того, вы можете запустить сервер в своем источнике, сделать запросы к этому серверу, и он может сделатьзапросы на https://authorization.server.com и передать вам ответы.Ваш сервер, не являющийся браузером, не подпадает под действие SOP.

...