Как программно открыть окно входа в систему, используя пользовательский скрипт GreaseMonkey для неявной авторизации гранта

Как мне закодировать пользовательский скрипт GreaseMonkey, чтобы перейти к окну авторизации/входа, находясь на другом веб-сайте (www.sharelatex.com)? Насколько я понимаю, GM_xmlhttpRequest будет выполнять эту функцию, и хотя я получаю статус «ОК» после успешной загрузки GM_xmlhttpRequest, окно входа в систему не появляется. Должен ли я использовать другую функцию? Этот вход в систему должен быть выполнен программно, чтобы пользовательский сценарий мог «поймать» номер токена, который прикрепляется к URL-адресу перенаправления после успешного входа в систему. Затем этот номер токена будет использоваться в вызове Mendeley API для загрузки нужного файла из моей учетной записи Mendeley (используя неявный поток предоставления).

Справочная информация: я пытаюсь создать пользовательский скрипт GreaseMonkey, который добавит кнопку в мою учетную запись www.sharelatex.com, которая при нажатии будет автоматически загружать файл из моей учетной записи на www.mendeley.com с использованием API этого сайта. Код, связанный с кнопкой, также должен учитывать требования входа и аутентификации, необходимые для использования API. Я зарегистрировал свое приложение в Mendeley, получил номер «идентификатора клиента» (0000, для иллюстрации), который я использовал для создания следующего URL-адреса:

var urlAuth  = "https://api.mendeley.com/oauth/authorize?client_id=0000&redirect_uri=http://localhost&response_type=token&scope=all"

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

// ==UserScript==
//  ... skipping over irrelevant lines ... 
// @grant       GM_xmlhttpRequest
// ==/UserScript==
var urlAuth  = "https://api.mendeley.com/oauth/authorize?client_id=0000&redirect_uri=http://localhost&response_type=token&scope=all"
/* ***************   CREATE BUTTON ************************* */
var input = document.createElement("input"); 
input.type = "button"; 
input.value="Update bibtex"; 
input.onclick = getBib; 
input.setAttribute("style", "font-size:18px; position:absolute; bottom:10px;left:10px;");
document.body.appendChild(input);
/* ================================================================ */
function getBib()
{    
GM_xmlhttpRequest({ 
method: 'GET',
url: urlAuth, 
onload: function(reply) { alert(reply.statusText) }
}

Предупреждение указывает на состояние OK, но окно входа в систему не появляется. Когда я делаю:

alert(urlAuth)

в разделе загрузки, и я вручную копирую / вставляю то, что появляется в окне предупреждения, в адресную область браузера, браузер переводит меня в соответствующее окно входа / авторизации, поэтому сам URL-адрес в порядке.

Почему GM_xmlhttpRequest не выводит меня на экран входа в систему? Я неправильно понимаю функциональность GM_xmlhttpRequest и вместо этого должен использовать другую функцию? Я потратил около 2 полных месяцев, пытаясь понять это, изучая сотни ссылок на тему OAuth2, пользовательских скриптов, Mendeley API и т. д. Несколько примеров: http://userscripts-mirror.org/scripts/review/292038 (многообещающе, так как это единственный пользовательский скрипт GreaseMonkey/Mendeley, но, к сожалению, не выполнять материал OAuth2), https://salesforce.stackexchange.com/questions/76397/accessing-salesforce-rest-api-through-greasemonkey-script (предоставленный ответ никогда не касался вопроса о том, как получить окно входа в систему).


person PMM    schedule 05.10.2017    source источник
comment
Ответ лежит в window.open и postMessage. См. пример на meta.stackexchange.com/a/293498/148310.   -  person Brock Adams    schedule 05.10.2017
comment
Спасибо за ответ, @BrockAdams. Я ввел почти дословно код примера в ‹meta.stackexchange.com/questions/293475/› и у меня есть много дополнительных вопросов (которые я задам в новых отдельных сообщениях). Чтобы получить всплывающее окно для входа в систему, я сделал следующее (явно, чтобы другие тоже могли извлечь выгоду): 660,height=480 ) `, где urlAuth определен выше.   -  person PMM    schedule 07.10.2017
comment
@BrockAdams, если у вас будет возможность, был бы очень признателен, если бы вы посмотрели на дополнительный вопрос, который я разместил здесь: stackoverflow.com/questions/46615950/. Я считаю, что на этот вопрос здесь дан удовлетворительный ответ, поэтому я открыл новый вопрос/сообщение.   -  person PMM    schedule 07.10.2017


Ответы (1)


В то время как тема процесса OAuth2 включает в себя несколько шагов, этот вопрос был сосредоточен на одном шаге: как заставить окно авторизации / входа в систему отображаться через пользовательский скрипт GreaseMonkey. Ответ (см. комментарий Брока Адамса выше) дан в примере, приведенном в meta.stackexchange.com/a/293498/148310. . Точнее, окно входа создается функцией window.open, как показано в следующем примере (см. строку № 21 ниже):

// ==UserScript==
<other needed info in the metadata block should be included here>
// @match       https://stackexchange.com/oauth/login_success*
// ==/UserScript==

var rootUrl = "https://api.mendeley.com/oauth/authorize?"
// the rootUrl should point to whatever API service you are trying to use. 
// I am using Mendeley, but could be i.e, facebook, YouTube, Twitter, Google, etc. 
var clientId = "0000"   // needs to be the number you got when you registered your app
// through whatever API service you want to use
var redirectUrl = "https://stackexchange.com/oauth/login_success"  
// The above directs where the login page will be redirected after successful
//     log-in/authorization. 
// This URL needs to point to a real page. 
// Also make sure that whatever is given for the redirectUrl is also 
//     listed in the @match statement in the metadata block section at the top, 
//     but with an astericks at the end (to allow for the token number to be 
//     attached as a hash fragment, as part of the OAuth2 process)
var other   = "response_type=token&scope=all" 
var urlAuth = rootUrl + clientId + "&" + redirectUrl + "&" + other
authWindow = window.open ( urlAuth, "Log in", "resizeable, scrollbars, status, toolbar, 
             dependent, width=660,height=480" ) 
// tailor window sizing, etc. to your own aesthetics
person PMM    schedule 07.10.2017