Ottenere ClientID univoco dall’estensione di Chrome?

Sto sviluppando l’estensione chrome. Ho bisogno della capacità di identificare ogni cliente come un cliente unico.

Non riesco a memorizzare guid in un cookie poiché i cookie possono essere cancellati. Ho bisogno di qualcosa da leggere dal sistema stesso che è unico.

Ora – So che JS non ha accesso alle risorse client (risorse locali) ma – ed ecco la mia domanda:

Domanda

Le estensioni chrome di Js forniscono API per ottenere informazioni client univoche (non mi interessa quali dati – purché siano univoci).

Modificare :

Giusto per chiarire :

All’utente verrà mostrata una chiave univoca (che è un hash del suo computer). questo codice verrà inviato a me e fornirò i risultati corrispondenti che l’utente verrà inviato (via e-mail) e solo allora – sarà in grado di utilizzare l’estensione.

(no, non tutti i paesi supportano il pagamento dell’estensione tramite portafoglio, in uno di questi paesi)

Per identificare univocamente un utente, suggerirei di generare un token casuale e memorizzarlo nella memoria chrome.storage ( chrome.storage ). L’ID utente deve essere generato una sola volta, quando il token non esiste nella memoria.

Per esempio:

 function getRandomToken() { // Eg 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); } // Eg 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. } }); 

Questo meccanismo si basa su chrome.storage.sync , che è abbastanza affidabile. Questo ID memorizzato verrà perso solo nei seguenti scenari:

  • L'utente reinstalla l'estensione. La memoria locale verrà cancellata quando si disinstalla l'estensione.
  • È stata superata una delle quote di archiviazione (leggi la documentazione ).
    Questo non accadrà perché l'unica operazione di scrittura si verifica alla prima esecuzione dell'estensione.
  • Lo spazio di archiviazione di Chrome viene danneggiato e non riesce a salvare i dati.
    Anche se l'utente non ha triggersto Chrome Sync, i dati verranno comunque salvati localmente. Ci sono stati errori con internals di Chrome che hanno provocato la perdita di dati, ma questi sono incidenti.
  • L'utente ha aperto gli strumenti di sviluppo per la tua pagina di estensione e ha eseguito chrome.storage.sync.clear() o qualcosa di simile.
    Non puoi proteggere gli utenti che possiedono le conoscenze per fare confusione con i componenti interni delle estensioni di Chrome.

Il metodo precedente è sufficiente se si desidera identificare univocamente un utente. Se si desidera veramente ottenere un ID basato su hardware, utilizzare anche chrome.storage.cpu e chrome.storage.memory . Tuttavia, non vedo alcun vantaggio nell'utilizzare queste fonti aggiuntive, perché possono cambiare se l'utente sostituisce l'hardware e non sono nemmeno univoci (due laptop identici riporterebbero gli stessi valori, ad esempio).

Aggiungere alla risposta di Rob W. Nel suo metodo, la stringa salvata si propagherebbe a tutte le istanze di Chrome firmate con lo stesso account utente di Google, con un numero di if grandi e piccoli.

Se devi identificare in modo univoco un profilo utente locale e non tutti i profili di Chrome con lo stesso utente Google, devi utilizzare chrome.storage.local nello stesso modo. Tuttavia, questo NON sarà un identificatore di installazione di Chrome univoco, ma solo un profilo all’interno dell’installazione.


Ciò che deve anche essere notato è che tutti questi dati non sono in alcun modo o forma legati a qualcosa – ha solo una buona probabilità di essere unico. Ma assolutamente nulla impedisce all’utente di leggere e clonare questi dati come meglio crede. Non è ansible, in questo scenario, proteggere il lato client.


Sto pensando che un modo più sicuro sarebbe utilizzare chrome.identity API chrome.identity per richiedere e mantenere un token offline (quindi non in scadenza) come prova della licenza. L’utente non può clonare facilmente questa memoria di token.

Non sono ancora esperto in OAuth, quindi se qualcuno può segnalare cosa c’è che non va in questa idea, sono i benvenuti.

Come suggerito da Xan, l’API chrome.identity è probabilmente la scelta migliore. È ansible ottenere l’indirizzo e-mail dell’utente e utilizzarlo come seme casuale per generare un codice di propria scelta. Le informazioni utente includono anche un campo “id” che ritengo sia unico ma non ho mai visto alcuna documentazione che lo sostenga. Puoi quindi utilizzare l’API chrome.storage.sync per archiviare la chiave generata nell’archivio dati online degli utenti per la tua app. In questo modo l’utente sarà in grado di accedere alla propria chiave privata ogni volta e ovunque si connetta a qualsiasi dispositivo.

Tieni presente che dovrai abilitare l’API oAuth2 nella console degli sviluppatori per la tua applicazione e includere la chiave dell’applicazione e gli ambiti appropriati nel manifest dell’app.

Ecco un esempio grezzo:

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