Django urlsafe base64 décodage avec déchiffrement
Je suis en train d'écrire mon propre système de captcha pour l'inscription de l'utilisateur. J'ai donc besoin de créer l'URL pour la réception généré captcha photos. Génération ressemble à ceci:
_cipher = cipher.new(settings.CAPTCHA_SECRET_KEY, cipher.MODE_ECB)
_encrypt_block = lambda block: _cipher.encrypt(block + ' ' * (_cipher.block_size - len(block) % _cipher.block_size))
#...
a = (self.rightnum, self.animal_type[1])
serialized = pickle.dumps(a)
encrypted = _encrypt_block(serialized)
safe_url = urlsafe_b64encode(encrypted)
Mais alors je suis en train de recevoir cette clé via une requête GET à la vue de la fonction, il échoue sur urlsafe_b64decode() avec "mappage de caractères doit retourner un entier, Aucun ou unicode" erreur:
def captcha(request):
try:
key = request.REQUEST['key']
decoded = urlsafe_b64decode(key)
decrypted = _decrypt_block(decoded)
deserialized = pickle.loads(decrypted)
return HttpResponse(deserialized)
except KeyError:
return HttpResponseBadRequest()
J'ai constaté que sur la sortie de urlsafe_b64encode il y a un str, mais demande GET retourne un objet unicode (c'est néanmoins une chaîne de droite). Str() n'a pas aidé (il renvoie une erreur de décodage profondément à l'intérieur de django), et si j'utilise la clé.repr il fonctionne, mais decryptor ne fonctionne pas avec un message d'erreur "les chaînes d'Entrée doit être un multiple de 16 ans, en longueur".
À l'intérieur d'un fichier de test toute cette construction fonctionne parfaitement, je ne peux pas comprendre, ce qui est mal?
source d'informationauteur Enchantner
Vous devez vous connecter pour publier un commentaire.
Le problème est que b64decode de façon très explicite ne peut prendre octets (une chaîne), et non unicode.
Puisque vous savez que vos données ne contient que des données ASCII (c'est ce que base64encode sera de retour), il devrait être sûr d'encoder vos points de code unicode au format ASCII ou UTF-8 octets, ces octets qui sera équivalent à l'ASCII vous attend.
J'ai résolu le problème!
Encore, mais je ne comprends pas, pourquoi il ne fonctionne pas de la première fois.