Подтвердить что ты не робот

Получение уникального идентификатора ClientID с расширением chrome?

Я разрабатываю расширение хром. Мне нужна возможность идентифицировать каждого клиента как уникального клиента.

Я не могу хранить guid в cookie, так как cookie можно удалить. Мне нужно что-то для чтения из самой системы, которая уникальна.

Теперь - я знаю, что JS не имеет доступа к клиентским ресурсам (локальные ресурсы), но - и вот мой вопрос:

Вопрос

Поддерживает ли chrome extensions Js API для получения уникальной информации о клиенте (мне не нужны данные, если они уникальны).

Изменить:

Просто уточнить:

Пользователю будет показан уникальный ключ (который является хэш-данными его компьютера). этот код будет отправлен мне, и я дам соответствующий результат, который будет отправлен пользователю (по электронной почте), и только после этого он сможет использовать расширение.

(нет, не все страны поддерживают продление платежа через кошелек, im в одной из этих стран)

4b9b3361

Ответ 1

Чтобы однозначно идентифицировать пользователя, я бы предложил создать случайный токен и сохранить его в вашем хранилище расширений (chrome.storage). Идентификатор пользователя должен генерироваться только один раз, когда токен не существует в хранилище.

Например:

function getRandomToken() {
    // E.g. 8 * 32 = 256 bits token
    var randomPool = new Uint8Array(32);
    crypto.getRandomValues(randomPool);
    var hex = '';
    for (var i = 0; i < randomPool.length; ++i) {
        hex += randomPool[i].toString(16);
    }
    // E.g. db18458e2782b2b77e36769c569e263a53885a9944dd0a861e5064eac16f1a
    return hex;
}

chrome.storage.sync.get('userid', function(items) {
    var userid = items.userid;
    if (userid) {
        useToken(userid);
    } else {
        userid = getRandomToken();
        chrome.storage.sync.set({userid: userid}, function() {
            useToken(userid);
        });
    }
    function useToken(userid) {
        // TODO: Use user id for authentication or whatever you want.
    }
});

Этот механизм основан на chrome.storage.sync, который является достаточно надежным. Этот сохраненный идентификатор будет потерян только в следующих сценариях:

  • Пользователь переустанавливает расширение. Локальное хранилище будет удалено при удалении расширения.
  • Одна из квот на хранение превышена (читайте документация).
    Это не произойдет, потому что единственная операция записи происходит при первом запуске вашего расширения.
  • Хранилище Chrome повреждено и не удается сохранить данные.
    Даже если у пользователя нет включенной синхронизации Chrome, данные будут сохранены локально. Были ошибки с внутренними элементами Chrome, которые привели к потере данных, но это инциденты.
  • Пользователь открыл инструменты разработчика для вашей страницы расширения и запустил chrome.storage.sync.clear() или что-то подобное.
    Вы не можете защищать от пользователей, обладающих знаниями, чтобы возиться с внутренними расширениями Chrome.

Предыдущий метод достаточно, если вы хотите однозначно идентифицировать пользователя. Если вы действительно хотите получить идентификатор на основе аппаратного обеспечения, используйте chrome.storage.cpu и chrome.storage.memory. Однако я не вижу никаких преимуществ в использовании этих дополнительных источников, потому что они могут измениться, если пользователь заменит аппаратное обеспечение, и они не являются уникальными (например, два идентичных ноутбука будут сообщать о таких же значениях).

Ответ 2

Добавить в Rob W ответ. В его методе сохраненная строка будет распространяться на каждый экземпляр Chrome, подписанный с той же учетной записью пользователя Google - с большим количеством больших и малых if.

Если вам нужно однозначно идентифицировать локальный профиль пользователя, а не все профили Chrome у одного и того же пользователя Google, вы должны использовать chrome.storage.local таким же образом. Это НЕ будет уникальным идентификатором установки Chrome, хотя это только профиль внутри этой установки.


Следует также отметить, что все эти данные никоим образом не связаны или не связаны ни с чем - у него есть хорошая вероятность быть уникальной. Но абсолютно ничего не мешает пользователю читать и клонировать эти данные по своему усмотрению. В этом случае вы не можете защитить клиентскую сторону.


Я думаю, что более безопасным способом было бы использовать API chrome.identity для запроса и поддержки токена в автономном режиме (следовательно, не истекающего срока действия) в качестве доказательства лицензии. Пользователь не может легко клонировать это хранилище токенов.

Я еще не разбираюсь в OAuth, поэтому, если кто-нибудь может указать, что не так с этой идеей, они могут.

Ответ 3

Как предложил Xan, API-интерфейс chrome.identity, вероятно, ваш лучший выбор. Вы можете получить адрес электронной почты пользователей и использовать это как случайное семя для генерации кода по вашему выбору. Информация о пользователе также включает в себя поле "id", которое, я считаю, уникально, но я никогда не видел документации, подтверждающей это. Затем вы можете использовать API chrome.storage.sync для хранения сгенерированного ключа в онлайн-хранилище данных пользователей для вашего приложения. Таким образом, пользователь сможет получить доступ к своему закрытому ключу всякий раз, когда и где бы он ни находился на каком-либо устройстве.

Обратите внимание, что вам нужно будет включить oAuth2 api в консоли разработчика для вашего приложения и включить в манифест приложения список приложений и соответствующие области.

Вот грубый пример:

function getUserInfo (interactive, callback )
{
    var xmlhttp = new XMLHttpRequest();
    var retry = true;
    var access_token;

    getToken();

    /**
     * Request the Auth Token
     */
    function getToken()
    {       
        chrome.identity.getAuthToken( { 'interactive': interactive }, function (token) {
            if ( chrome.runtime.lastError )
            {
                console.log( "ERROR! " + chrome.runtime.lastError.message );
                return;
            }
            if ( typeof token != 'undefined ')
            {
                access_token = token;
                sendRequest( );
            }
            else
                callback( );
        });

    }

    function sendRequest()
    {       
        xmlhttp.open('GET', 'https://www.googleapis.com/userinfo/v2/me' );
        xmlhttp.setRequestHeader('Authorization','Bearer ' + access_token );
        xmlhttp.onload = requestComplete;
        xmlhttp.send();
    }

    function requestComplete()
    {
        if ( this.status == 401 && retry )
        {
            retry = false; // only retry once
            console.log( "Request failed, retrying... " + this.response );
        }
        else
        {
            console.log( "Request completed. User Info: " + this.response );
            callback(null, this.status, this.response );
            var userInfo = JSON.parse( this.response );
            storeUniqueKey( userInfo );

        }
    }
}

function storeUniqueKey( info )
{
    var key;
    // TODO: Generate some key using the user info: info.loginName
    // user info here contains several fields you might find useful.
    // There is a user "id" field here which is numeric and I believe that
    // is a unique identifier that could come in handy rather than generating your 
    // own key.

    ...

    chrome.storage.sync.set ( { user_key: key } );
}