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.storage.sync.clear()
了类似的东西.如果要唯一标识用户,则上一个方法就足够了.如果您真的想获得基于硬件的ID,请使用chrome.storage.cpu
和chrome.storage.memory
.我没有看到使用这些附加源的任何好处,因为如果用户替换硬件它们可以改变,并且它们也不是唯一的(例如,两个相同的笔记本电脑将报告相同的值).
正如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)
归档时间: |
|
查看次数: |
19052 次 |
最近记录: |