12

REST API を介して Redmine チケット マネージャーと通信する Greasemonkey スクリプトを実行しています。ユーザーは Redmine からデータを取得するためにログインする必要があるため、スクリプトのインストール時にユーザーに資格情報を要求し、それらをスクリプトに保存する方法が必要です。

スクリプト自体で値を直接編集するようにユーザーに依頼せずに、これを実現できますか?

編集:
この質問に対する回答はすでにあるので、非常に優れたフレームワークであるため、すぐ下にある回答を検証します。

4

1 に答える 1

12

これは、ログイン資格情報を取得および保存するためのフレームワークです。 スクリプトは、最初の実行時に情報の入力を求め、 を使用して暗号化して保存しGM_setValue()ます。

また、Greasemonkey コンテキスト メニューに 2 つの項目を追加して、ユーザー名またはパスワードを変更できるようにします。

// ==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.

重要:

  1. ユーザースクリプトでのログインには常にリスクが伴います。
  2. このフレームワークはそのリスクを大幅に軽減しますが、Greasemonkey と Tampermonkey で利用できるストレージ メカニズムは安全ではなく、ブラウザー ベンダーは機密情報の保存に対して CYA を使用しています。悪意のある人物がユーザー スクリプトブラウザ データの両方を入手した場合、パスワードをリバース エンジニアリングできます。もちろん、彼がそれを持っている場合、彼はあなたのマシンの 1 つを乗っ取った可能性が高いです。
  3. LastPassKeePassなどのパスワード マネージャーを使用するのが賢明です。
  4. 絶対に最悪のことは、資格情報をユーザースクリプト自体に保存することです。ゲストでさえそれらを見ることができ、あなたは「ハッキング」されることが保証されます.
于 2013-03-07T10:57:17.857 に答える