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

如何使用React在Firebase中创建自定义令牌?

谭桐
2023-03-14

我正在尝试创建一个自定义令牌,以使用用户的用户名登录。我看过一些文件https://firebase.google.com/docs/auth/admin/create-custom-tokens#web,通过如何为用户提供用户名而不是电子邮件登录链接到我?,我发现我需要补充

使用Firebase Admin SDK创建自定义令牌

在客户端上使用自定义令牌登录

目前我可以看到基于留档需要包含什么,但我不确定这将在源代码中的位置。我在哪里添加留档中的代码?这是userUser.js文件的源代码,以防有帮助。

import { useEffect, useState } from "react";
import { useRouter } from "next/router";
import firebase from "firebase/app";
import "firebase/auth";

import initFirebase from "../../config";
import {
  removeUserCookie,
  setUserCookie,
  getUserFromCookie,
} from "./userCookie";

initFirebase();

export const mapUserData = async (user) => {
  const { uid, email } = user;
  const token = await user.getIdToken(true);
  return {
    id: uid,
    email,
    token,
  };
};

const useUser = () => {
  const [user, setUser] = useState();
  const router = useRouter();

  // this is most likely where the custom token for
  // username goes
  const logout = async () => {
    return firebase
      .auth()
      .signOut()
      .then(() => {
        router.push("/");
      })
      .catch((e) => {
        console.error(e);
      });
  };

  useEffect(() => {
    const cancelAuthListener = firebase
      .auth()
      .onIdTokenChanged(async (userToken) => {
        if (userToken) {
          const userData = await mapUserData(userToken);
          setUserCookie(userData);
          setUser(userData);
        } else {
          removeUserCookie();
          setUser();
        }
      });

    const userFromCookie = getUserFromCookie();
    if (!userFromCookie) {
      return;
    }
    setUser(userFromCookie);
    return () => cancelAuthListener;
  }, []);

  return { user, logout };
};

export { useUser };

任何帮助都将不胜感激。

共有1个答案

宇文梓
2023-03-14

您只能在服务器环境中使用admin sdk(如在Firebase Functions或其他一些服务器中)-您不能在使用React的客户端环境中使用它。从概念上讲,这种工作方式是:

  1. 用户在您的客户端应用程序中输入用户名和密码
  2. 客户端应用程序将用户名和密码发送到您的服务器
  3. 服务器检查用户名和密码,如果正确,则使用admin SDK创建自定义令牌并将其发送回客户端应用程序
  4. 客户端应用使用该自定义令牌登录Firebase

所以它看起来是这样的(注意,这里我不处理任何错误,但您会希望):

// client.js
const sendToServer = (username, password) => {
  // Step 1 - client sends the username/password to the cloud function
  return axios.post(`${myCloudFunctionUrl}/login`, {
    username,
    password
  }).then((response) => {
    // Step 5 - the client logs the user in with the custom token
    return firebase.auth().signInWithCustomToken(response.data.token)
  }).then(() => {
    // Step 6 - the user is now logged in and redirected to the dashboard
    router.push("/dashboard")
  })
}
// server.js (using Firebase Functions, but use whatever back end you want)
exports.login = functions.https.onRequest((req, res) => {
  const {username, password} = req.body
  // Step 2 - function verifies the username and password and gets the user's uid for the custom token
  return verifyUserInDatabase(username, password).then((uid) => {
    // Step 3 - the server creates a custom token
    return admin.auth().createCustomToken(uid)
  }).then((token) => {
    // Step 4 - the server sends the token back in its response
    res.json({ token })
  })
})

 类似资料:
  • 问题内容: 我正在尝试在Log4j2中编写自己的RewritePolicy。该文档指出: RewritePolicy是一个接口,允许实现在将LogEvent传递给Appender之前检查并可能对其进行修改。RewritePolicy声明一个必须执行的名为rewrite的方法。该方法通过LogEvent传递,并且可以返回相同事件或创建一个新事件。 这是我的 java类 : 这是我的 yaml配置 文

  • 我通过createCustomToken()创建了自定义身份验证令牌,请参见https://firebase.google.com/docs/auth/admin/create-custom-tokens. 但稍后,当我尝试通过verifyIdToken()函数验证此令牌时,它会抛出以下错误 这是合理的,因为没有这样的ID。。。但我需要的是,简单地验证令牌,类似于jwt。验证()。。。 有没有人遇

  • 问题内容: 如何使用带有此类JSON的NEST配置索引: 我可以使用类创建自定义分析器,但找不到如何创建自定义过滤器并将其注册到分析器中的方法。 提前致谢! 问题答案: 经过一番搜索,我找到了一个解决方案:

  • 我试图使用OpenNLPJavaAPI从文档中提取名称、技能等实体。但它没有提取正确的名称。我使用opennlp源锻造链接上可用的模型 下面是一段java代码- 我想做的是: 我正在使用ApacheTika将PDF文档转换为纯文本文档 但它正在提取姓名和其他单词。它不是提取专有名称。如何创建自定义模型,从文档中提取游泳、编程等技能? 给我一些想法! 任何帮助都将不胜感激!?

  • 问题内容: 我正在http://www.cafeaulait.org/javafaq.html上阅读#6.10项,然后我开始怀疑大型企业如何创建自己的JVM实现。一个人会尝试(或可行)实验性的东西吗? 问题答案: 从技术上讲,创建该新JVM所需的所有信息都是该语言和目标平台的公共规范。即使字节码解释在很大程度上相同,JVM还是需要根据其是要在台式机还是手机上运行而有所不同。 一些开始寻找信息的地方

  • 问题内容: 我正在尝试在Formik中使用DatePicker。但是,当我单击DatePicker的日期时,其表单值不会更改。相反,我得到了这个错误: 未捕获到的TypeError:e.persist不是Formik._this.handleChange上的函数(formik.es6.js:5960) 我简化代码,下面的代码 我用谷歌搜索了一些文档,https://github.com/jared