首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Next-8月与firebase身份验证

Next-8月与firebase身份验证
EN

Stack Overflow用户
提问于 2022-02-21 14:46:21
回答 1查看 1K关注 0票数 2

只想让我的自定义凭据提供程序在登录页面上使用Firebase身份验证来验证输入的用户名和密码

页/api/auth/.nextauth.ts

代码语言:javascript
复制
    import NextAuth from "next-auth"
import { getDatabase } from "firebase/database"
import { DB } from "../../../constants/firebase"
import { FirebaseAdapter } from "@next-auth/firebase-adapter"
import * as firestoreFunctions from "firebase/firestore"
import CredentialsProvider from "next-auth/providers/credentials"

export default NextAuth({
    session: {
        strategy: "database",
    },
    providers: [
        CredentialsProvider({
            name: "credentials",
            credentials: {
                username: {
                    label: "Username",
                    type: "text",
                    placeholder: "somebody@gmail.com",
                },
                password: { label: "Password", type: "password" },
            },
            async authorize(credentials, req) {
                const database = getDatabase()
                console.log(database)

                const user = {
                    id: 1,
                    usename: "j",
                    password: "123456789",
                }
                if (
                    credentials?.username === user.usename &&
                    credentials.password === "123456789"
                ) {
                    return user
                }
                return null
            },
        }),
    ],
    adapter: FirebaseAdapter({
        db: DB,
        ...firestoreFunctions,
    }),
    // pages: {
    //  signIn: "/auth/signin",
    //  signOut: "/auth/signout",
    //  error: "/auth/error", // Error code passed in query string as ?error=
    //  verifyRequest: "/auth/verify-request", // (used for check email message)
    //  newUser: "/auth/new-user", // New users will be directed here on first sign in (leave the property out if not of interest)
    // },
    callbacks: {
        async jwt({ token, user }) {
            if (user) {
                token.email = user.email
            }
            return token
        },
        async session({ session, token, user }) {
            if (token) {
                session.user!.email = token.email
            }
            return session
        },
        redirect({ url, baseUrl }) {
            if (url.startsWith(baseUrl)) return url
            else if (url.startsWith("/"))
                return new URL(url, baseUrl).toString()
            return baseUrl
        },
    },
})

firebase.ts

代码语言:javascript
复制
import { initializeApp, getApp, getApps } from "firebase/app"
import { getAnalytics } from "firebase/analytics"
import { getFirestore } from "@firebase/firestore"
import { getStorage } from "@firebase/storage"
import getFirebaseObject from "./firebaseConfig"

const app = !getApps.length ? initializeApp(getFirebaseObject()) : getApp()
const DB = getFirestore(app)
const storages = getStorage()
const analytics = getAnalytics(app)

export { app, DB, analytics, storages }

如你所见

代码语言:javascript
复制
const user = {
                id: 1,
                usename: "j",
                password: "123456789",
            } 

事实上,除了这些静态数据之外,我想从Firebase搜索并获得正确的用户信息,我知道还有其他方法可以做到这一点,但是我喜欢使用next-auth进行最后的更改,希望确保这是一个亮点;)

EN

回答 1

Stack Overflow用户

发布于 2022-03-28 17:54:49

我在这个公共存储库中找到了一个公共存储库,其中作者所做的事情与您想要实现的类似,这就是用您的数据库凭据创建一个自定义令牌。也许这个储存库可以帮你。它有一些错误,但它给了我一个大致的想法,做什么,因为我有一个类似的情况。

代码语言:javascript
复制
try {
    if (user !== null) {
        await customTokenSignIn(user.id, user.email);
        (await getUser(user.id)) ??
        (await createUser(toReqUser(user, account)));
        const data = await getUser(user.id);
        setResUser(user, data as ResUser);
        return true;
    }
    return false;
} catch (e) {
    console.error(e);
    return false;
    }


const customTokenSignIn = async (id: string, email: string) => {
  const hash = toHash(id);
  const customToken = await adminAuth.createCustomToken(hash);

  await auth.signInWithCustomToken(customToken).then((res) => {
    res.user?.updateEmail(email);
  });
  await adminAuth.setCustomUserClaims(hash, { sid: id });

  await createUserToken({ id: id, firebaseUid: hash });
};

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71208257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档