从chrome扩展获取唯一的ClientID?

Roy*_*mir 32 javascript google-chrome google-chrome-extension

我正在开发chrome扩展.我需要能够将每个客户端识别为唯一的客户端.

因为可以删除cookie,所以我无法将guid存储在cookie中.我需要从系统本身读取一些独特的东西.

现在 - 我知道JS无法访问客户端资源(本地资源)但是 - 这是我的问题:

chrome扩展Js是否提供获取唯一客户信息的API(我不关心什么数据 - 只要它是唯一的).

编辑:

只是为了澄清:

将向用户显示唯一键(其是他的计算机的哈希数据).此代码将发送给我,我将提供用户将被发送的匹配结果(通过电子邮件),然后 - 他将能够使用该扩展.

(不,并非所有国家都通过钱包支持延期付款,我在其中一个国家)

Rob*_*b W 59

为了唯一地标识用户,我建议生成随机令牌并将其存储在扩展的存储(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.
    }
});
Run Code Online (Sandbox Code Playgroud)

这种机制依赖于chrome.storage.sync,这是非常可靠的.此存储的ID仅在以下情况下丢失:

  • 用户重新安装扩展.卸载扩展时将清除本地存储.
  • 已超出其中一个存储配额(请参阅文档).
    这不会发生,因为唯一的写操作发生在您的扩展的第一次运行.
  • Chrome的存储空间已损坏,无法保存数据.
    即使用户未启用Chrome同步,数据仍会保存在本地.Chrome的内部存在漏洞导致数据丢失,但这些都是事件.
  • 用户已为您的扩展页面打开了开发人员工具并运行chrome.storage.sync.clear()了类似的东西.
    您无法防范拥有该知识的用户弄乱Chrome扩展程序的内部.

如果要唯一标识用户,则上一个方法就足够了.如果您真的想获得基于硬件的ID,请使用chrome.storage.cpuchrome.storage.memory.我没有看到使用这些附加源的任何好处,因为如果用户替换硬件它们可以改变,并且它们也不是唯一的(例如,两个相同的笔记本电脑将报告相同的值).

  • chrome.storage不可靠......它可以随时清除 (3认同)
  • "这个存储的ID只会在以下罕见情况下丢失"您忘记了一个场景:只需重新安装应用程序即可. (3认同)

Zoc*_*oum 5

正如Xan所建议的,chrome.identity API可能是您的最佳选择。您可以获取用户的电子邮件地址,并将其用作随机种子以生成您选择的代码。用户信息还包括一个“ id”字段,我认为该字段是唯一的,但是我从未见过任何能证明这一点的文档。然后,您可以使用chrome.storage.sync API将生成的密钥存储在您的应用的用户在线数据存储中。这样,用户将能够在任何时间和任何地点登录任何设备来访问其私钥。

请注意,您将必须在开发人员控制台中为您的应用程序启用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 } );
}
Run Code Online (Sandbox Code Playgroud)