2017-02-10 3 views
3

CORS на GitHub OAuth

import request from 'superagent'; 
 

 
const self = this; 
 
    request 
 
     .post('https://github.com/login/oauth/access_token') 
 
     .set('Content-Type', 'multipart/form-data') 
 
     .query({ 
 
     client_id: CLIENT_ID, 
 
     client_secret: CLIENT_SECRET, 
 
     callback: 'http://127.0.0.1:3000/callback', 
 
     code, 
 
     state, 
 
     }) 
 
     .end((err, res) => { 
 
     const token = res.body.access_token; 
 
     console.log(token); 
 
     self.setToken(token); 
 
     });

Код выше даст мне ошибку как этот

XMLHttpRequest не может загрузить https://github.com/login/oauth/access_token?client_id=112asdecf3805fdada12& ... 127.0.0.1% 3A3000% 2Fcallback & код = 434ebd7bb98d9809bf6e & Состояние = HelloWorld1234. Нет заголовка «Access-Control-Allow-Origin» на запрашиваемом ресурсе . Origin 'http://127.0.0.1:3000' поэтому не разрешен доступ.

Я понятия не имею, почему, хотя я зарегистрировал заявление OAuth с GitHub и обратного вызова URL является http://127.0.0.1:3000/callback

+1

[понимать CORS] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) –

ответ

3

Хотя все the actual GitHub API endpoints support CORS, отправляя заголовки правильных ответов, то a known issue что https://github.com/login/oauth/access_token конечная точка для создания токен доступа OAuth не поддерживает запросы CORS из веб-приложений.

очень специфический обходной путь для этого случая использовать https://github.com/prose/gatekeeper:

Gatekeeper: Позволяет клиентские приложения танцевать OAuth с GitHub.

Из-за некоторых ограничений, связанных с безопасностью, Github запрещает вам реализовывать поток веб-приложений OAuth только в клиентском приложении.

Это настоящий облом. Поэтому мы создали Gatekeeper, который является недостающим элементом, который вам нужен, чтобы заставить его работать.

Общее временное решение: использовать открытый обратный прокси-сервер, как https://cors-anywhere.herokuapp.com/

var req = new XMLHttpRequest(); 
req.open('POST', 
    'https://cors-anywhere.herokuapp.com/https://github.com/login/oauth/access_token', 
    true); 
req.setRequestHeader('Accept', 'application/json'); 
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
req.send('code=' + encodeURIComponent(location.query.code) + 
    '&client_id=foo' + 
    '&client_secret=bar'); 
... 

Смотрите также How to use Cors anywhere to reverse proxy and add CORS headers.

+1

Насколько заинтересованы пользователи с предоставлением идентификатора и секретности своего клиента ненадежному открытому обратному прокси? – osowskit

+0

@osowskit Очевидно, они должны быть заинтересованы. Используйте на свой страх и риск и все такое. Если владелец прокси-сервера хочет зарегистрировать учетные данные из своих запросов. Именно поэтому было бы лучше запустить Gatekeeper или другой такой прокси-сервер на своем собственном сайте. (И почему я сказал, что открытый обратный прокси-сервер является более «общим решением» для случая ограничения ограничений CORS для сайтов, которые не выбирают запросы XHR/Fetch для перекрестного происхождения.) – sideshowbarker

+1

Или используйте что-то вроде AWS API Шлюз, чтобы создать свой собственный авторизационный вызов и сохранить секретный ключ client_secret – TimoSolo

Смежные вопросы