mirror of
https://github.com/AustinKelsay/plebdevs.git
synced 2025-06-06 18:31:00 +00:00
Fixed anon login
This commit is contained in:
parent
96acb96490
commit
b2a180b100
@ -129,47 +129,66 @@ export const authOptions = {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
CredentialsProvider({
|
||||||
|
id: "anonymous",
|
||||||
|
name: "Anonymous",
|
||||||
|
credentials: {
|
||||||
|
pubkey: { label: "Public Key", type: "text" },
|
||||||
|
privkey: { label: "Private Key", type: "text" },
|
||||||
|
},
|
||||||
|
authorize: async (credentials) => {
|
||||||
|
let pubkey, privkey;
|
||||||
|
|
||||||
|
if (credentials?.pubkey && credentials?.pubkey !== "null" && credentials?.privkey && credentials?.privkey !== "null") {
|
||||||
|
// Use provided keys
|
||||||
|
pubkey = credentials.pubkey;
|
||||||
|
privkey = credentials.privkey;
|
||||||
|
} else {
|
||||||
|
// Generate new keys
|
||||||
|
const sk = generateSecretKey();
|
||||||
|
pubkey = getPublicKey(sk);
|
||||||
|
privkey = bytesToHex(sk);
|
||||||
|
console.log('pubkey', pubkey);
|
||||||
|
console.log('privkey', privkey);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if user exists in the database
|
||||||
|
let dbUser = await getUserByPubkey(pubkey);
|
||||||
|
|
||||||
|
if (!dbUser) {
|
||||||
|
// Create new user if not exists
|
||||||
|
dbUser = await createUser({
|
||||||
|
pubkey: pubkey,
|
||||||
|
username: pubkey.slice(0, 8), // Use first 8 characters of pubkey as username
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return user object with pubkey and privkey
|
||||||
|
return { ...dbUser, pubkey, privkey };
|
||||||
|
},
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
callbacks: {
|
callbacks: {
|
||||||
async jwt({ token, trigger, user }) {
|
async jwt({ token, user, account }) { // Add 'account' parameter here
|
||||||
if (trigger === "update") {
|
|
||||||
// if we trigger an update call the authorize function again
|
|
||||||
const newUser = await authorize(token.user.pubkey);
|
|
||||||
token.user = newUser;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user) {
|
if (user) {
|
||||||
token.user = user;
|
token.user = user;
|
||||||
|
if (user.pubkey && user.privkey) {
|
||||||
|
token.pubkey = user.pubkey;
|
||||||
|
token.privkey = user.privkey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (account?.provider === 'anonymous') {
|
||||||
|
token.isAnonymous = true;
|
||||||
}
|
}
|
||||||
return token;
|
return token;
|
||||||
},
|
},
|
||||||
async session({ session, token }) {
|
async session({ session, token }) {
|
||||||
if (session.user?.email) {
|
|
||||||
const existingUser = await getUserByEmail(session.user.email);
|
|
||||||
if (existingUser) {
|
|
||||||
if (!existingUser?.pubkey) {
|
|
||||||
let sk = generateSecretKey()
|
|
||||||
let pk = getPublicKey(sk)
|
|
||||||
let skHex = bytesToHex(sk)
|
|
||||||
const updatedUser = await updateUser(existingUser.id, { pubkey: pk, privkey: skHex });
|
|
||||||
if (!updatedUser) {
|
|
||||||
console.error("Failed to update user");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
const fullUser = await getUserByPubkey(pk);
|
|
||||||
session.user = fullUser;
|
|
||||||
token.user = fullUser;
|
|
||||||
return session;
|
|
||||||
} else {
|
|
||||||
session.user = existingUser;
|
|
||||||
token.user = existingUser;
|
|
||||||
return session;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Add user from token to session
|
|
||||||
session.user = token.user;
|
session.user = token.user;
|
||||||
session.jwt = token;
|
if (token.pubkey && token.privkey) {
|
||||||
|
session.pubkey = token.pubkey;
|
||||||
|
session.privkey = token.privkey;
|
||||||
|
}
|
||||||
|
session.isAnonymous = token.isAnonymous;
|
||||||
return session;
|
return session;
|
||||||
},
|
},
|
||||||
async redirect({ url, baseUrl }) {
|
async redirect({ url, baseUrl }) {
|
||||||
@ -180,6 +199,16 @@ export const authOptions = {
|
|||||||
session = {}
|
session = {}
|
||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
|
async signIn({ user, account }) {
|
||||||
|
if (account.provider === 'anonymous') {
|
||||||
|
return {
|
||||||
|
...user,
|
||||||
|
pubkey: user.pubkey,
|
||||||
|
privkey: user.privkey,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
secret: process.env.NEXTAUTH_SECRET,
|
secret: process.env.NEXTAUTH_SECRET,
|
||||||
session: { strategy: "jwt" },
|
session: { strategy: "jwt" },
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
import { signIn, useSession } from "next-auth/react"
|
import { signIn, useSession, getSession } from "next-auth/react"
|
||||||
|
import { useRouter } from "next/router";
|
||||||
import { useState, useEffect } from "react"
|
import { useState, useEffect } from "react"
|
||||||
import { useNDKContext } from "@/context/NDKContext";
|
import { useNDKContext } from "@/context/NDKContext";
|
||||||
import GenericButton from "@/components/buttons/GenericButton";
|
import GenericButton from "@/components/buttons/GenericButton";
|
||||||
import { InputText } from 'primereact/inputtext';
|
import { InputText } from 'primereact/inputtext';
|
||||||
|
|
||||||
// todo add recaptcha for additional security
|
|
||||||
export default function SignIn() {
|
export default function SignIn() {
|
||||||
const [email, setEmail] = useState("")
|
const [email, setEmail] = useState("")
|
||||||
const [showEmailInput, setShowEmailInput] = useState(false)
|
const [showEmailInput, setShowEmailInput] = useState(false)
|
||||||
const {ndk, addSigner} = useNDKContext();
|
const {ndk, addSigner} = useNDKContext();
|
||||||
const { data: session, status } = useSession(); // Get the current session's data and status
|
const { data: session, status } = useSession();
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.log("session", session)
|
console.log("session", session)
|
||||||
@ -34,9 +35,35 @@ export default function SignIn() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleAnonymousSignIn = (e) => {
|
const handleAnonymousSignIn = async (e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
signIn("anonymous")
|
|
||||||
|
// Check if we have keys in local storage
|
||||||
|
const storedPubkey = localStorage.getItem('anonymousPubkey')
|
||||||
|
const storedPrivkey = localStorage.getItem('anonymousPrivkey')
|
||||||
|
|
||||||
|
const result = await signIn("anonymous", {
|
||||||
|
pubkey: storedPubkey,
|
||||||
|
privkey: storedPrivkey,
|
||||||
|
redirect: false
|
||||||
|
})
|
||||||
|
|
||||||
|
if (result?.ok) {
|
||||||
|
// Fetch the session to get the pubkey and privkey
|
||||||
|
const session = await getSession()
|
||||||
|
if (session?.pubkey && session?.privkey) {
|
||||||
|
localStorage.setItem('anonymousPubkey', session.pubkey)
|
||||||
|
localStorage.setItem('anonymousPrivkey', session.privkey)
|
||||||
|
console.log("Anonymous login successful. Pubkey:", session.pubkey)
|
||||||
|
router.push('/')
|
||||||
|
} else {
|
||||||
|
console.error("Pubkey or privkey not found in session")
|
||||||
|
}
|
||||||
|
// Redirect or update UI as needed
|
||||||
|
} else {
|
||||||
|
// Handle error
|
||||||
|
console.error("Anonymous login failed:", result?.error)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
Loading…
x
Reference in New Issue
Block a user