从 chrome 扩展中获取唯一的 ClientID?

新手上路,请多包涵

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

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

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

问题

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

编辑 :

只是为了澄清:

用户将看到一个唯一的密钥(这是他计算机的哈希数据)。此代码将发送给我,我将提供匹配结果(通过电子邮件)发送给用户,只有这样 - 他才能使用扩展程序。

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

原文由 Royi Namir 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

为了唯一标识用户,我建议生成一个随机令牌并将其存储在扩展程序的存储中( chrome.storage )。当存储中不存在令牌时,用户 ID 只需生成一次。

例如:

 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 ,还是比较靠谱的。此存储的 ID 只会在以下情况下丢失:

  • 用户重新安装扩展。 卸载扩展程序时将清除本地存储。
  • 已超过其中一个存储配额(阅读 文档)。

这不会发生,因为唯一的写操作发生在您的扩展的第一次运行时。 - Chrome 的存储损坏,无法保存数据。

即使用户没有启用 Chrome 同步,数据仍会保存在本地。 Chrome 的内部结构存在导致数据丢失的错误,但这些都是事件。 - 用户已打开您的扩展页面的开发人员工具 并运行了 chrome.storage.sync.clear() 或类似的东西。

您无法防止拥有破坏 Chrome 扩展程序内部知识的用户。


如果你想唯一标识一个用户,前面的方法就足够了。如果您 真的 想获得基于硬件的 ID,请同时使用 chrome.storage.cpuchrome.storage.memory 。不过,我看不到使用这些额外来源有任何好处,因为如果用户更换硬件,它们可能会发生变化,而且它们也不是唯一的(例如,两台相同的笔记本电脑会报告相同的值)。

原文由 Rob W 发布,翻译遵循 CC BY-SA 3.0 许可协议

正如 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 } );
}

原文由 Zoccadoum 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题