我想检查是否有办法首先从REST API获取用户登录信息,然后将结果交给Firebase JS SDK,就像我使用SDK方法来登录用户一样?
在Google Cloud文档中使用REST API,这与这里的Firebase REST文档相同。当成功时,我将得到一个JSON,如下所示:
{ "idToken": string, "email": string, ... }
但是在JS SDK (v9)中,流看起来像这样,它返回UserCredential承诺:
signInWithEmailLink(auth, email, window.location.href)
.then((result) => {
window.localStorage.removeItem('emailForSignIn');
console.log(result.user)
})
所以如果我使用REST API并获得JSON,那么我如何让SDK知道这是登录用户?这样我就可以用这样的方法了?
const auth = getAuth();
const user = auth.currentUser;
我这样做的原因是在Auth系统之上,我实现了一个跨设备的电子邮件链接登录功能,所以发送的电子邮件链接不是Firebase Auth生成的一个,而是一个链接到我自己的服务器上的一个点,它将在服务器端登录用户,然后将这个结果传递回初始客户端。
我认为你正在尝试登录用户在同一设备上,他们输入他们的电子邮件,而不是他们打开由Firebase发送的登录链接的设备。在这种情况下,您必须自己验证用户,然后使用Firebase SDK登录他们。
认证流程如下:
- 用户输入他们的电子邮件,你的服务器发送一个包含某种标识符的自定义链接到他们的电子邮件。
- 用户单击该链接并向服务器发送响应,表示用户已被验证。
- 您使用Firebase Admin SDK生成自定义令牌,并将其发送回用户开始登录/注册过程的设备。
- 然后使用Firebase Client SDK使用自定义令牌登录。
我不确定您如何响应链接已被点击后的第一个设备,但我已经写了这个功能与套接字。IO和它的工作完美和快速。(尽管您需要将套接字ID存储在某个地方,以便发出一个正确的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,并且您将令牌发送回正确的客户端。