在我的单位中,我们有一个将用户密码更改与 Google 同步的流程。我们最近将此过程从预配 API 转换为管理员 SDK 目录 API。不过,在此过程中,我们开始收到少量密码更改的错误响应,经过调查,我们确定我们的内部支持人员正在通过设置不符合我们 Google 网域中定义的密码长度要求的临时密码来响应用户的密码重置请求。显然,我们在内部需要进行一些流程更改。
这些错误仅在切换到管理员 SDK 目录 API 后出现,这让我想到了我的问题。这两个 API 强制执行域中定义的密码长度要求的方式是否有区别?更具体地说,预配 API 是否未强制实施这些要求?
预配 API 和目录 API 之间的密码长度要求/实施有任何变化。话虽如此,如果您的客户端发送使用MD5,SHA-1或crypt散列的密码,那么Google的服务器将无法确定实际密码,因此无法确认它是否满足长度要求。我建议将密码作为加盐加密哈希发送。这些很容易在Linux或Mac OS命令行上生成:
$ echo 1234 | mkpasswd -s -m SHA-512
$6$/LHr6nGP$sqS21G30MNh/NAaNHuVitvk/ld3b8u5Ky8N7Rbs.5eptnETaPlV9hUk8mAOJdQ2KHacdJ5OGMRKD2ZXBuINyN1
所以一个 users.patch() 请求正文看起来像:
{
"hashFunction": "crypt",
"password": "$6$/LHr6nGP$sqS21G30MNh/NAaNHuVitvk/ld3b8u5Ky8N7Rbs.5eptnETaPlV9hUk8mAOJdQ2KHacdJ5OGMRKD2ZXBuINyN1"
}
将用户的密码设置为 1234。密码对用户有效,因为 Google 无法在您设置密码时确定密码的长度或强度。
当然,正如您上面指出的,您确实应该强制执行最小的密码长度(更不用说强度了)。
要生成哈希,您可以使用 passlib 库:
from passlib.handlers.sha2_crypt import sha512_crypt
hashed_password = sha512_crypt.encrypt(password)