OAuth неявное предоставление - не удается получить фрагмент URL, который содержит токен доступа - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь реализовать поток неявного предоставления OAuth с помощью AWS Cognito.В частности, после входа на мой веб-сайт я пытаюсь выполнить запрос GET к конечной точке Cognito AUTHORIZATION ;ответ на этот запрос должен перенаправить меня на выбранный мной URL-адрес - назовем его URL-адрес обратного вызова - и предоставить нужный токен доступа во фрагменте.

Если я сделаю этот запрос, войдя в адресную строку браузерасоответствующий URL-адрес для конечной точки AUTHORIZATION, все происходит, как и ожидалось: браузер перенаправляется на URL-адрес обратного вызова, и фрагмент фрагмента доступа появляется во фрагменте этого URL-адреса.

Однако, если я выполняю этот же запрос асинхронно изСценарий на моем веб-сайте, использующий XMLHttpRequest, не позволяет получить доступ к фрагменту, возвращенному в URL-адресе обратного вызова (и вкладка сети Chrome показывает, что фрагмент, содержащий токен, фактически возвращается, как в сценарии адресной строки, описанном выше).Как я могу получить доступ к этому фрагменту?

Мой код выглядит следующим образом:

let xhr = new XMLHttpRequest();
let method = options.method.toUpperCase();

let extractFrom = ['url', 'code'];

xhr.open(options.method, options.url, true);
xhr.withCredentials = true;
for (const key in options.headers) {
    xhr.setRequestHeader(key, options.headers[key]);
}

xhr.onreadystatechange = function () {
    const status = this.status;
    const respUrl = this.responseURL;
    const respHeaders = this.getAllResponseHeaders();
    const respBody = this.response;

    if (this.readyState === XMLHttpRequest.DONE) {
        if (status === 200) {
            let val = extractParameter(extractFrom[0], respUrl, extractFrom[1]);
            resolve(val);
        } else {
            console.error('Other Response Text: ' + this.statusText);
            reject(this.statusText);
        }
    }
};

xhr.onerror = function () {
    console.error('Error: ' + xhr.statusText);
    reject(this.statusText);
};

xhr.send(null);

1 Ответ

0 голосов
/ 03 апреля 2019

Фрагмент - материал сайта клиента, остается только в браузере.Вам нужно будет использовать javascript для явного извлечения, см. https://openid.net/specs/openid-connect-core-1_0.html#FragmentNotes. Вы можете избежать фрагмента, используя response_mode = form_post, если сервер OpenID Connect поддерживает его, см. https://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html.

...