Код авторизации Exchange Quire для токена доступа с GM_xmlhttpRequest - PullRequest
1 голос
/ 13 октября 2019

Это может быть глупый вопрос, и я пытался следовать инструкциям, приведенным в quire-api-blog , но мне все еще не удается получить токен из пользовательского сценария JavaScript Tampermonkey.

Синтаксис FYI для GM_xmlhttpRequest доступен для https://www.tampermonkey.net/documentation.php?ext=dhdg#GM_xmlhttpRequest

Я использую следующий код:

GM_xmlhttpRequest({
    method: "POST",
    url: "https://quire.io/oauth/token",
    data: JSON.stringify({
              grant_type: "authorization_code",
              code: "xxx",
              client_id: ":yyy",
              client_secret: "zzz"
          }),
    onload: function(r){
        console.log(r);
    }
});

В консоли возвращается следующий объект:

finalUrl: "https://quire.io/oauth/token"
​
readyState: 4
​
response: 
​
responseHeaders: "content-encoding: gzip\r\ncontent-type: text/plain; charset=utf-8\r\ndate: Sun, 13 Oct 2019 09:04:26 GMT\r\nserver: nginx/1.17.3\r\nset-cookie: DARTSESSID=7d20dcf1f0eae6ce0f69d9fe615e9ce5; Path=/; HttpOnly\r\nx-content-type-options: nosniff\r\nx-firefox-spdy: h2\r\nx-frame-options: SAMEORIGIN\r\nx-xss-protection: 1; mode=block\r\n"
​
responseText: 
​
responseXML: 
​
status: 400
​
statusText: "Bad Request"

Есть идеи, что пошло не так?

Заранее благодарен за добрый ответ.

Рафаэль

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Вы должны быть осторожны с content-type вашего запроса. Разные API-интерфейсы XHR используют разные значения по умолчанию.

Спецификация OAUTH2 для запроса токена доступа описывает тип контента как application/x-www-form-urlencoded.

Пока GreaseMonkey отправляет запросы с использованием JSON по умолчанию, что можно изменить, установив заголовок Content-Type и кодировав данные в виде строки, используя 'x-www-form-urlcoded'

GM.xmlHttpRequest({
  method: "POST",
  url: "https://quire.io/oauth/token",
  data: "grant_type=authorization_code&code=xxx&client_id=yyy&client_secret=zzz",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded"
  },

jquery.ajax () позволяет автоматически установить тип содержимого по умолчанию для application / x-www-form-urlencoded

ВАЖНОПОБОЧНОЕ ПРИМЕЧАНИЕ: Использование $ .ajax () указывает на использование в браузере. Если это правда, тогда НЕ делайте этого! Предоставление вашего client_secret приложению, работающему в браузере, позволит любому аутентифицироваться в качестве вашего идентификатора запроса и получить доступ к вашему проекту с помощью grant_type: client_authentication. На данный момент API Quire требует, чтобы вы запустили выделенный сервер, с которого вы должны выполнить запрос токена доступа, чтобы не показывать client_secret. Если вы используете jquery на стороне сервера, тогда все в порядке.

Существует открытый Issue # 8 , который также поддерживает поток кода авторизации на стороне клиента без использования client_secret (подходит из SPAили расширение браузера).

0 голосов
/ 13 октября 2019

Между тем, несмотря на это, я смог заставить ее работать с помощью команды jQuery $ .ajax (), см. https://api.jquery.com/jquery.ajax/,, которая дает:

$.ajax({
    type: "POST",
    url: "https://quire.io/oauth/token",
    data: {
        grant_type: "authorization_code",
        code: "xxx",
        client_id: ":yyy",
        client_secret: "zzz"
    },
    success: function(r){
        console.log(r);
    }
});

Все еще любопытнознать с интеллектуальной точки зрения, что происходит с GM_xmlhttpRequest

...