Armazenando input de login / senha do usuário em um script Greasemonkey na instalação

Eu estou fazendo um script Greasemonkey que se comunica com o gerenciador de tickets Redmine através da API REST. Como o usuário precisa fazer o login para obter os dados do Redmine, eu preciso de uma maneira de perguntar ao usuário suas credenciais na instalação do script e salvá-las no script.

Isso pode ser conseguido sem pedir ao usuário para editar os valores diretamente no próprio script?

EDITAR:
Uma vez que já existe uma resposta para esta pergunta, validarei a resposta dada logo abaixo, pois é uma estrutura muito boa.

Aqui está uma estrutura para obter e armazenar credenciais de login. O script solicita as informações na primeira execução e armazena-as, criptografadas, usando GM_setValue() .

Ele também adiciona dois itens ao menu de contexto do Greasemonkey para permitir a alteração do nome de usuário ou senha.

 // ==UserScript== // @name _Autologin, sensitive info framework // @include http://YOUR_SERVER.COM/YOUR_PATH/* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js // @require http://crypto.stanford.edu/sjcl/sjcl.js // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // ==/UserScript== var encKey = GM_getValue ("encKey", ""); var usr = GM_getValue ("lognUsr", ""); var pword = GM_getValue ("lognPwd", ""); if ( ! encKey) { encKey = prompt ( 'Script key not set for ' + location.hostname + '. Please enter a random string:', '' ); GM_setValue ("encKey", encKey); usr = pword = ""; // New key makes prev stored values (if any) unable to decode. } usr = decodeOrPrompt (usr, "U-name", "lognUsr"); pword = decodeOrPrompt (pword, "P-word", "lognPwd"); function decodeOrPrompt (targVar, userPrompt, setValVarName) { if (targVar) { targVar = unStoreAndDecrypt (targVar); } else { targVar = prompt ( userPrompt + ' not set for ' + location.hostname + '. Please enter it now:', '' ); GM_setValue (setValVarName, encryptAndStore (targVar) ); } return targVar; } function encryptAndStore (clearText) { return JSON.stringify (sjcl.encrypt (encKey, clearText) ); } function unStoreAndDecrypt (jsonObj) { return sjcl.decrypt (encKey, JSON.parse (jsonObj) ); } //-- Add menu commands that will allow U and P to be changed. GM_registerMenuCommand ("Change Username", changeUsername); GM_registerMenuCommand ("Change Password", changePassword); function changeUsername () { promptAndChangeStoredValue (usr, "U-name", "lognUsr"); } function changePassword () { promptAndChangeStoredValue (pword, "P-word", "lognPwd"); } function promptAndChangeStoredValue (targVar, userPrompt, setValVarName) { targVar = prompt ( 'Change ' + userPrompt + ' for ' + location.hostname + ':', targVar ); GM_setValue (setValVarName, encryptAndStore (targVar) ); } // ADD YOUR CODE TO SET THE USERNAME AND PASSWORD ON THE LOGIN PAGE, HERE. 

Importante:

  1. Fazer o login com um userscript sempre traz riscos.
  2. Essa estrutura reduz muito esse risco, mas os mecanismos de armazenamento disponíveis para o Greasemonkey e o Tampermonkey não são seguros e os fornecedores de navegadores, CYA, contra o armazenamento de informações confidenciais . Se um bandido recebe tanto o seu userscript como os dados do seu navegador, ele pode fazer a engenharia reversa da sua senha. É claro que, se ele tem isso, é provável que ele tenha uma de suas máquinas de qualquer maneira.
  3. O mais inteligente é usar um gerenciador de senhas como o LastPass , o KeePass , etc.
  4. A pior coisa a fazer , é armazenar credenciais em um usercript em si. Mesmo um convidado pode vê-los e você será “hackeado”, garantido.