Кодировать идентификатор пользователя AWS Cognito в действительный ObjectId в python и декодировать его обратно - PullRequest
1 голос
/ 06 июля 2019

Я хочу закодировать идентификатор пользователя AWS Cognito в действительный ObjectId, который можно использовать в MongoDB в качестве идентификатора документа, чтобы каждый пользовательский документ мог быть идентифицирован по идентификатору пользователя.

Действительный ObjectId должен быть 12-байтовым вводом или 24-символьной шестнадцатеричной строкой

Вот пример идентификатора пользователя AWS Cognito (str):

b5bb610b-de5a-480e-9363-84905ae33d23

Я пытался преобразовать идентификатор пользователя Cognito в байты, а также в шестнадцатеричные числа, но это не удовлетворяет требованию. Вот код

import bson
u = "b5bb610b-de5a-480e-9363-84905ae33d23"
bson.ObjectId(u.encode("utf-8"))
bson.ObjectId(u.encode("utf-8").hex())

Если используется sha224, как показано ниже,

from hashlib import sha224
from bson.objectid import ObjectId
hasher = sha224()
cognito_id = cognito_id.encode("utf-8")
prefix = cognito_id[:6]
hasher.update(cognito_id)
hashed = hasher.digest()
partial_hash = hashed[:9]
mongo_id = prefix+partial_hash
mongo_id = ObjectId(str(mongo_id))

Все они выдают ошибку с указанием вышеупомянутого требования.

Использование шестнадцатеричной строки выполняет кодирование,

from hashlib import sha224
from bson.objectid import ObjectId
hasher = sha224()
cognito_id = cognito_id.encode("utf-8")
prefix = cognito_id.hex()[:6]
hasher.update(cognito_id)
hashed = hasher.hexdigest()[:18]
mongo_id = prefix + hashed
mongo_id = ObjectId(mongo_id)

Но я не могу декодировать его обратно. Я могу получить только первые 6 символов идентификатора Cognito по

cognito_prefix = str(mongo_id)[:6]

Будет ситуация, когда мне понадобится весь идентификатор Cognito, полученный из идентификатора объекта mongo.

Мне нужно закодировать идентификатор пользователя Cognito в действительный идентификатор объекта, который можно сохранить в mongoDB, а также декодировать его обратно.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 06 июля 2019

Используйте hashlib для вычисления sha224 идентификатора Cognito.Отправьте первые 12 байтов в Mongo в качестве уникального идентификатора документа.

Недостатком этого подхода будет то, что порядок сортировки для JOIN станет случайным, и вы сможете узнать что-либо об исходном идентификаторе Cognito только после извлечения документа Mongo.,Чтобы исправить это, вы можете сделать 3/9 сплит.Используя ваш пример идентификатора, вы можете скопировать три байта 0xb5 0xbb 0x61 дословно как префикс идентификатора документа, а затем добавить первые девять байтов результата sha224 для унификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...