web-dev-qa-db-fra.com

Créer un jeton aléatoire en Javascript basé sur les détails de l'utilisateur

Je veux créer une chaîne aléatoire (jeton) qui peut être utilisée pour identifier un utilisateur tout en évitant tout conflit potentiel avec les jetons des autres utilisateurs.

Ce à quoi je pensais, c'était un hachage MD5 de navigator.userAgent + new Date().getTime() pour générer le jeton, mais cela nécessite une bibliothèque MD5 Javascript complète pour le hacher, ce que je ne veux pas vraiment faire.

Il doit être composé de A-Z/0-9 caractères et idéalement pas plus de 32 caractères. Je suis ouvert à toutes les idées. Merci!

Juste pour clarifier, je ne recherche aucun générateur de chaîne aléatoire, la chaîne aléatoire doit être générée à partir des détails des utilisateurs disponibles via Javascript et peut également utiliser du temps pour éviter les conflits potentiels!

26
fire

Paiement crypto.js projet. C'est une collection d'algorithmes cryptographiques. Le projet a des fichiers js distincts pour chaque algorithme de hachage.

5
Josnidhin

Vous pouvez générer un nombre aléatoire et le convertir en base 36 (0-9a-z):

var Rand = function() {
    return Math.random().toString(36).substr(2); // remove `0.`
};

var token = function() {
    return Rand() + Rand(); // to make it longer
};

token(); // "bnh5yzdirjinqaorq0ox1tf383nb3xr"
107
pimvdb

Cette fonction vous permet de définir la longueur du jeton et les caractères autorisés.

function generate_token(length){
    //edit the token allowed characters
    var a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".split("");
    var b = [];  
    for (var i=0; i<length; i++) {
        var j = (Math.random() * (a.length-1)).toFixed(0);
        b[i] = a[j];
    }
    return b.join("");
}

Appelez simplement generate_token

generate_token(32); //returns "qweQj4giRJSdMNzB8g1XIa6t3YtRIHPH"
7
Kareem

J'utilise une approche similaire à celle de Kareem , mais avec moins d'appels de fonction et d'opérations de tableau intégrées pour une grande amélioration des performances.

Selon un test de performance , cette méthode surpasse également la réponse acceptée par une petite marge. De plus, il fournit un paramètre n pour générer n'importe quelle taille de jeton de taille à partir d'une liste blanche de caractères acceptables. Il est flexible et fonctionne bien.

function generateToken(n) {
    var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    var token = '';
    for(var i = 0; i < n; i++) {
        token += chars[Math.floor(Math.random() * chars.length)];
    }
    return token;
}
3
ThisClark

C'est très peu probable, mais Math.random () pourrait retourner 0.0. Dans ce cas, la solution de pimvdb retournerait "" (chaîne vide). Donc, voici une autre solution, qui retourne dans tous les cas une base36 aléatoire avec une longueur de 10 caractères:

function generateToken() {
    Math.floor(1000000000000000 + Math.random() * 9000000000000000)
          .toString(36).substr(0, 10)
}
2
shaack
//length: defines the length of characters to express in the string

const Rand=()=>Math.random(0).toString(36).substr(2);
const token=(length)=>(Rand()+Rand()+Rand()+Rand()).substr(0,length);

console.log(token(40));
//example1:  token(10) => result: tsywlmdqu6
//example2:  token(40) => result: m4vni14mtln2547gy54ksclhcv0dj6tp9fhs1k10
2
Jasp402