Die*_*ruz 6 javascript firebase-authentication next.js next-auth
我正在将 next-auth 与 firebase 适配器一起使用。在将用户保存到数据库方面一切工作正常,但在身份验证方面有些东西不起作用。
import NextAuth from "next-auth"
import GoogleProvider from "next-auth/providers/google"
import { FirebaseAdapter } from "@next-auth/firebase-adapter"
import { db } from "../../../utils/firebase/firebase"
import * as firestoreFunctions from 'firebase/firestore'
import { adminAuth } from "../../../utils/firebase/firebaseAdmin"
import { getAuth, signInWithCustomToken } from "firebase/auth"
const auth = getAuth()
export default NextAuth({
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_ID,
clientSecret: process.env.GOOGLE_SECRET,
state: false,
}),
],
adapter: FirebaseAdapter({
db: db,
...firestoreFunctions,
}),
callbacks: {
async signIn({ user, account, profile, email, credentials }) {
console.log(user, 'user')
const customToken = await adminAuth.createCustomToken(user.id)
const customSignIn = await signInWithCustomToken(auth, customToken)
console.log(customSignIn, 'customSignIn')
console.log(customSignIn.user, 'customSignIn.user')
user = customSignIn.user
console.log(user, 'user 2')
return true
},
async redirect({ url, baseUrl }) {
return baseUrl
},
async session({ session, user, token }) {
if (session?.user) {
session.user.id = token.sub
}
return session
},
async jwt({ token, user, account, profile, isNewUser }) {
if (isNewUser) {
const additionalClaims = {
isStudent: true,
isTeacher: false,
isStaff: false,
isAdmin: false
}
const customToken = await adminAuth.createCustomToken(token.sub, additionalClaims)
const customSignIn = await signInWithCustomToken(auth, customToken)
user = customSignIn.user
}
return token
}
},
session: {
strategy: 'jwt',
},
})
Run Code Online (Sandbox Code Playgroud)
我的用户可以登录,但未经过身份验证。
const auth = getAuth()
onAuthStateChanged(auth, (user) => {
if (user) {
// User is signed in, see docs for a list of available properties
// https://firebase.google.com/docs/reference/js/firebase.User
console.log('user')
console.log(user)
// ...
} else {
console.log('no user')
// User is signed out
// ...
}
})
Run Code Online (Sandbox Code Playgroud)
观察者返回“无用户”,但我已登录。
您没有看到登录的用户,因为 firebase 身份验证是在服务器端而不是客户端完成的。
您应该尝试将 customToken 传递到会话,然后在客户端使用它来让用户登录到 firebase 身份验证。
您还需要将 useSession 挂钩包装在如下所示的自定义挂钩中,并使用它而不是 useSession。
const useFirebaseSession = () => {
const session = useSession();
const [status, setStatus] = useState(session.status);
useEffect(() => {
if (session && session.status === 'authenticated') {
signInWithCustomToken(auth, session.customToken).then(() => {
setStatus('authenticated');
});
}
}, [session]);
useEffect(() => {
if(session.status !== 'authenticated') {
setStatus(session.status)
}
}, [session.status]);
return { data: session.data, status };
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5511 次 |
| 最近记录: |