将外部用户导入到 firebase
Import external user to firebase
我想将用户从外部数据库导入到 firebase。
密码是用 sha256
函数散列的,密码前面加了盐(这是一个 UUID)。
例如:
password = "123qwerty!"
salt = "cb60eb29-95a2-418e-be2a-c1c107fb1add"
hash = sha256(salt+password)
# 54ccb21d42c6961aa1b666b7cb0485f85aab2f2323399fb2959ea5e4e9f6f595
现在要将其导入 firebase,我将执行以下操作:
users = []*auth.UserToImport
users = append(users, (&auth.UserToImport{}).
UID("some-uid").
Email("jon.foo@example.com").
PasswordHash([]byte("54ccb21d42c6961aa1b666b7cb0485f85aab2f2323399fb2959ea5e4e9f6f595")).
PasswordSalt([]byte("cb60eb29-95a2-418e-be2a-c1c107fb1add")).
DisplayName("Jon FOO"))
h := hash.SHA256{
Rounds: 1,
InputOrder: hash.InputOrderSaltFirst,
}
res, err := cl.ImportUsers(ctx, users, auth.WithHash(h))
if err != nil {
log.Fatal(err)
}
用户在 firebase 中导入良好(我可以在控制台中看到),但是当我尝试登录时出现此错误 The password is invalid or the user does not have a password.
我看不出我的方法有什么问题,也许应该更新 Rounds
参数,但更新到什么值?
谢谢!
我终于找到了我的问题。
在我的例子中,我给出了 PasswordHash
密码的十六进制表示形式:
PasswordHash([]byte("54ccb21d42c6961aa1b666b7cb0485f85aab2f2323399fb2959ea5e4e9f6f595")).
原来我得先解密密码,像这样:
decoded, err := hex.DecodeString("54ccb21d42c6961aa1b666b7cb0485f85aab2f2323399fb2959ea5e4e9f6f595")
if err != nil {
return err
}
user := (&auth.UserToImport{}).
PasswordHash(decoded).
PasswordSalt([]byte("cb60eb29-95a2-418e-be2a-c1c107fb1add")). // the salt stays the same
...
// call ImportUsers with the same hash configuration (Rounds: 1, InputOrder: SaltFirst)
更新后,我 运行 代码,我现在可以使用导入的用户进行身份验证。
快速说明:如评论中所述,节点 SDK 没有指定输入顺序的选项(盐或密码优先),这似乎是一个重要的缺失功能。
我想将用户从外部数据库导入到 firebase。
密码是用 sha256
函数散列的,密码前面加了盐(这是一个 UUID)。
例如:
password = "123qwerty!"
salt = "cb60eb29-95a2-418e-be2a-c1c107fb1add"
hash = sha256(salt+password)
# 54ccb21d42c6961aa1b666b7cb0485f85aab2f2323399fb2959ea5e4e9f6f595
现在要将其导入 firebase,我将执行以下操作:
users = []*auth.UserToImport
users = append(users, (&auth.UserToImport{}).
UID("some-uid").
Email("jon.foo@example.com").
PasswordHash([]byte("54ccb21d42c6961aa1b666b7cb0485f85aab2f2323399fb2959ea5e4e9f6f595")).
PasswordSalt([]byte("cb60eb29-95a2-418e-be2a-c1c107fb1add")).
DisplayName("Jon FOO"))
h := hash.SHA256{
Rounds: 1,
InputOrder: hash.InputOrderSaltFirst,
}
res, err := cl.ImportUsers(ctx, users, auth.WithHash(h))
if err != nil {
log.Fatal(err)
}
用户在 firebase 中导入良好(我可以在控制台中看到),但是当我尝试登录时出现此错误 The password is invalid or the user does not have a password.
我看不出我的方法有什么问题,也许应该更新 Rounds
参数,但更新到什么值?
谢谢!
我终于找到了我的问题。
在我的例子中,我给出了 PasswordHash
密码的十六进制表示形式:
PasswordHash([]byte("54ccb21d42c6961aa1b666b7cb0485f85aab2f2323399fb2959ea5e4e9f6f595")).
原来我得先解密密码,像这样:
decoded, err := hex.DecodeString("54ccb21d42c6961aa1b666b7cb0485f85aab2f2323399fb2959ea5e4e9f6f595")
if err != nil {
return err
}
user := (&auth.UserToImport{}).
PasswordHash(decoded).
PasswordSalt([]byte("cb60eb29-95a2-418e-be2a-c1c107fb1add")). // the salt stays the same
...
// call ImportUsers with the same hash configuration (Rounds: 1, InputOrder: SaltFirst)
更新后,我 运行 代码,我现在可以使用导入的用户进行身份验证。
快速说明:如评论中所述,节点 SDK 没有指定输入顺序的选项(盐或密码优先),这似乎是一个重要的缺失功能。