javascript - plugin - make a google chrome extension
¿Obtiene ClientID único desde la extensión de Chrome? (3)
Como sugirió Xan, la API chrome.identity es probablemente su mejor opción. Puede obtener la dirección de correo electrónico de los usuarios y usarla como una semilla aleatoria para generar un código de su elección. La información del usuario también incluye un campo "id" que creo que es único, pero nunca he visto ninguna documentación que lo justifique. A continuación, puede usar la API chrome.storage.sync para almacenar la clave generada en el almacenamiento de datos en línea de los usuarios de su aplicación. De esta forma, el usuario podrá acceder a su clave privada cada vez que inicie sesión en cualquier dispositivo.
Tenga en cuenta que deberá habilitar las API de oAuth2 en la consola de desarrollo de su aplicación e incluir la clave de la aplicación y los ámbitos adecuados en el manifiesto de su aplicación.
Aquí hay un ejemplo crudo:
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 } );
}
Estoy desarrollando la extensión de Chrome. Necesito la capacidad de identificar a cada cliente como un cliente único.
No puedo almacenar GUID en una cookie ya que la cookie se puede eliminar. Necesito que se lea algo del sistema en sí, que es único.
Ahora - sé que JS no tiene acceso a los recursos del cliente (recursos locales), pero - y aquí está mi pregunta:
Pregunta
¿Las extensiones chrome Js proporcionan API para obtener información única del cliente (no me importa qué datos, siempre y cuando sea único).
Editar:
Solo para aclarar :
Al usuario se le mostrará una clave única (que es un dato hash de su computadora). se me enviará este código y proporcionaré el resultado coincidente que se enviará al usuario (por correo electrónico) y solo entonces podrá usar la extensión.
(no, no todos los países admiten pagos de extensión a través de billetera, estoy en uno de esos países)
Para agregar a la answer Rob W. En su método, la cadena guardada se propagaría a cada instancia de Chrome que haya iniciado sesión con la misma cuenta de usuario de Google, con muchos if grandes y pequeños.
Si necesita identificar de manera única un perfil de usuario local, y no todos los perfiles de Chrome con el mismo usuario de Google, desea emplear chrome.storage.local
de la misma manera. Sin embargo, este NO será un identificador único de instalación de Chrome, solo un perfil dentro de esa instalación.
Lo que también debe tenerse en cuenta es que todos estos datos no están vinculados a nada de ninguna manera, solo tienen una buena probabilidad de ser únicos. Pero absolutamente nada impide que el usuario lea y clone estos datos como lo considere oportuno. No puede, en este escenario, proteger el lado del cliente.
Estoy pensando que una forma más segura sería usar chrome.identity
API para solicitar y mantener un token fuera de línea (por lo tanto, no vencido) como prueba de licencia. El usuario no puede clonar fácilmente este almacenamiento de token.
Todavía no soy versado en OAuth, así que si alguien puede señalar qué está mal con esta idea, son bienvenidos.
Para identificar a un usuario de manera única, sugiero generar un token aleatorio y almacenarlo en el almacenamiento de la extensión ( chrome.storage
). El ID de usuario debe generarse solo una vez, cuando el token no existe en el almacenamiento.
Por ejemplo:
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.
}
});
Este mecanismo se basa en chrome.storage.sync
, que es bastante confiable. Esta ID almacenada solo se perderá en los siguientes escenarios:
- El usuario vuelve a instalar la extensión. El almacenamiento local se borrará al desinstalar la extensión.
- Se ha excedido una de las cuotas de almacenamiento (lea la chrome.storage.sync ).
Esto no sucederá porque la única operación de escritura ocurre en la primera ejecución de su extensión. - El almacenamiento de Chrome se corrompe y no puede guardar los datos.
Incluso si el usuario no tiene habilitada la Sincronización de Chrome, los datos se guardarán localmente. Hubo errores con las partes internas de Chrome que provocaron la pérdida de datos, pero estos son incidentes. - El usuario ha abierto las herramientas de desarrollador para su página de extensión y ejecutó
chrome.storage.sync.clear()
o algo similar.
No puede protegerse contra usuarios que poseen el conocimiento para interferir con las partes internas de las extensiones de Chrome.
El método anterior es suficiente si desea identificar de manera única a un usuario. Si realmente desea obtener una identificación basada en hardware, use chrome.storage.cpu
y chrome.storage.memory
también. Sin embargo, no veo ningún beneficio en el uso de estas fuentes adicionales, ya que pueden cambiar si el usuario reemplaza el hardware, y tampoco son únicas (dos computadoras portátiles idénticas reportarían los mismos valores, por ejemplo).