问题描述
我想检查是否有办法先从 REST API 获取用户登录信息,然后将结果交给 Firebase JS SDK,就像我使用 SDK 方法登录用户一样?
在此处使用 REST API on Google Cloud docs,这与 Firebase REST 文档 here 相同。成功后我会得到一个 JSON,如下所示:
{ "idToken": string,"email": string,... }
但在 JS SDK (v9) 中,流程看起来像 this,其中 returns 是 UserCredential 承诺:
signInWithEmailLink(auth,email,window.location.href)
.then((result) => {
window.localStorage.removeItem('emailForSignIn');
console.log(result.user)
})
因此,如果我使用 REST API 并获得 JSON,那么我如何让 SDK 知道这是已登录用户?这样我就可以使用 this 之类的方法?
const auth = getAuth();
const user = auth.currentUser;
我这样做的原因是在 Auth 系统之上,我正在实施跨设备电子邮件链接登录功能,因此发送的电子邮件链接不是 Firebase Auth 生成的链接,而是指向指向我自己的服务器,它会在服务器端让用户登录,然后将此结果传回给发起客户端。
解决方法
我认为您尝试在用户输入电子邮件的同一台设备上登录,而不是在他们打开 Firebase 发送的登录链接的设备上登录。在这种情况下,您必须自己对用户进行身份验证,然后使用 Firebase SDK 登录。
身份验证流程如下:
- 用户输入他们的电子邮件,您的服务器会向他们的电子邮件发送一个包含某种标识符的自定义链接。
- 用户点击该链接并向服务器发送响应,该用户已通过验证。
- 您使用 Firebase Admin SDK 生成自定义令牌并将其发送回用户开始登录/注册过程的设备。
- 然后,您使用 Firebase Client SDK 使用自定义令牌登录它们。
我不确定您在点击链接后如何响应第一个设备,但我已经使用 socket.io 编写了此功能,并且它运行完美且快速。 (尽管您需要将套接字 ID 存储在某处,以便您发出更正一个)。但是,只要您能够通知用户,这应该不是问题。
// After user has clicked the link
const uid = 'some-uid';
admin
.auth()
.createCustomToken(uid)
.then((customToken) => {
// Send token back to client (original device)
})
.catch((error) => {
console.log('Error creating custom token:',error);
});
将令牌发送回用户后,您可以使用 Javascript SDK 而不是 REST API 来登录。
firebase.auth().signInWithCustomToken(token)
.then((userCredential) => {
// Signed in
var user = userCredential.user;
// ...
})
只需确保您正确地对用户进行身份验证,因为在您生成自定义链接并将令牌发送回正确的客户端时,那里不涉及 Firebase。