当前位置: 首页 > 知识库问答 >
问题:

在python中将AWS Cognito用户ID编码为有效的ObjectId,并对其进行解码

干浩阔
2023-03-14

我想将AWS Cognito用户id编码成一个有效的ObjectId,它可以在MongoDB中用作文档id,这样每个用户文档都可以通过用户的用户id进行标识。

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

下面是一个示例AWS Cognito用户ID(str):

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.html" target="_blank">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_prefix = str(mongo_id)[:6]

会有这样一种情况,我需要从mongo对象ID派生出整个Cognito ID。

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

请帮忙。

共有1个答案

邹晟睿
2023-03-14

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

这种方法的缺点是JOIN的排序顺序变得随机化,并且您只能在获取Mongo文档后了解原始Cognito ID的任何信息。为了弥补这一点,你可以选择3/9分割。使用示例ID,您可以逐字复制三个字节0xb5 0xbb 0x61作为文档ID的前缀,然后将sha224结果的初始九个字节追加到uniquify。

 类似资料:
  • 我想用python实现下面的功能,它使用公钥加密密码,然后使用base 64进行编码。我搜索了许多答案,但没有找到解决方案,我想可能是我不明白。请给我一些建议好吗? 我使用以下代码,但它会引发错误。

  • 问题内容: 我正在尝试使用(使用最新的Webkit)下载二进制文件,并使用以下简单功能对base64的内容进行编码: 附带说明一下,以上所有内容都是标准Javascript内容,包括和 这工作非常顺利,我什至可以使用Javascript解码base64内容: 现在,我想使用Python解码base64编码的内容,该内容使用一些JSON字符串来获取字符串值。天真的,这就是我的工作: 但是生成的文件无

  • 本文向大家介绍Python imageio读取视频并进行编解码详解,包括了Python imageio读取视频并进行编解码详解的使用技巧和注意事项,需要的朋友参考一下 读视频和写视频一直由于编解码的问题给程序员造成很多麻烦。对此进行了一些探索。用Python读取视频有两种主要方法,分别是基于imageio库和OpenCV,其中OpenCV加上ffmpeg的安装编译很麻烦,推荐大家使用第一种方法,不

  • 这是一个古老的问题(#1、#2),我仍然在纠结于这个问题。现在尝试使用一个简单的SQL查询: 正在努力进行此SQL查询: 我需要所有的post_id,其中='services'和='publish',并且关联的()的值为1(一)。然后使用我使用另一个()传递的另一个元值对结果进行排序。如果我从查询中删除,那么就会得到这些post ID,但对于上面的查询,我什么也得不到。 我该怎么做呢?

  • 我试图通过参数在谷歌搜索,它的工作,当我搜索一个词,但一个我做空间它坏了我知道有一种方法来编码网址。 回溯: 还有一次,我用希伯来文写道: UnicodeEncodeError:“ascii”编解码器无法对位置14-18中的字符进行编码:序号不在范围内(128)

  • 我正在尝试找到一种使用私钥加密字符串并使用公钥解密它的方法。我使用OpenSSL生成密钥,如下所述: http://www.akadia.com/services/ssh_test_certificate.html 这就是我目前拥有的 然而,在< code>ImportPublicKey方法上,我得到一个异常< code>ASN1损坏数据 传递给该方法的字符串具有以下格式: @“MIICXWIBA