【问题标题】:Encode a AWS Cognito User ID into a valid ObjectId in python and Decode it back在 python 中将 AWS Cognito 用户 ID 编码为有效的 ObjectId 并将其解码回来
【发布时间】:2019-11-16 18:12:40
【问题描述】:

我想将 AWS Cognito 用户 ID 编码为一个有效的 ObjectId,该 ObjectId 可以在 MongoDB 中用作文档 ID,以便每个用户的文档都可以通过用户的用户 ID 来识别。

有效的 ObjectId 必须是 12 字节的输入或 24 字符的十六进制字符串

这是一个示例 AWS Cognito 用户 ID(字符串):

b5bb610b-de5a-480e-9363-84905ae33d23

我尝试将 Cognito 用户 ID 转换为字节和十六进制,但它不满足要求。这是代码

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)

但我无法将其解码回来。我只能通过

获取 Cognito Id 的前 6 个字符
cognito_prefix = str(mongo_id)[:6]

在某些情况下,我需要从 mongo 对象 ID 派生的整个 Cognito ID。

我需要将 Cognito 用户 ID 编码为可以存储在 mongoDB 中的有效对象 ID,并将其解码回来。

请帮忙。

【问题讨论】:

    标签: python-3.x mongodb amazon-cognito


    【解决方案1】:

    使用 hashlib 计算 Cognito ID 的 sha224。 将前 12 个字节作为唯一文档 ID 提供给 Mongo。

    这种方法的缺点是 JOIN 的排序顺序变得随机化, 而且您只能了解有关原始 Cognito ID 的任何信息 获取 Mongo 文档后。 为了解决这个问题,您可以选择进行 3 / 9 拆分。 使用您的示例 ID, 您可以复制三个字节 0xb5 0xbb 0x61 逐字作为文档 ID 的前缀, 然后附加sha224 结果的前九个字节 唯一化。

    【讨论】:

    • 它不工作。我已经更新了提到您建议的实施的问题。 Hex Digest 正在运行。
    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2018-07-02
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多