Back

Next SSR Auth session.secret is empty using OTP

  • 0
  • Self Hosted
  • Web
Mopsior
17 Sep, 2024, 15:15

Hi, I have problem with auth. When I try to login/signup using OTP, at the end session.secret is empty, but looks like a whole procces passed correctly. I have tried creating new API key (someone response from simillar post), but still don't work

Using Nextjs 14.2.8, node-appwrite 13

TypeScript
// app/signup/page.tsx
import { createAdminClient, getLoggedInUser } from "@/lib/server/appwrite"
import { cookies } from "next/headers"
import { redirect } from "next/navigation"
import { ID } from "node-appwrite"

export default async function SignupPage() {
    const user = await getLoggedInUser()
    if (user) redirect("/rooms")

    return (
        <>
        <form action={sendEmail}>
            <input type="email" name="email" placeholder="email@email.com" />
            <button type="submit">Send Email</button>
        </form>
        <form action={login}>
            <input type="text" name="code" placeholder="code" />
            <button type="submit">Submit code</button>
        </form>
        </>
    )
}

const sendEmail = async (formData: FormData) => {
    'use server'
    const email = formData.get('email') as string

    const { account } = await createAdminClient()

    const sessionToken = await account.createEmailToken(
        ID.unique(),
        email
    )

    cookies().set('user-id', sessionToken.userId, {
        path: '/',
    })
}

const login = async (formData: FormData) => {
    'use server'
    const code = formData.get('code') as string

    const { account } = await createAdminClient()

    const userID = cookies().get('user-id')?.value

    const session = await account.createSession(
        userID as string,
        code
    )
    console.log(session, session.secret)

    cookies().set('user-session', session.secret, {
        path: '/',
        sameSite: 'lax',
    })

    redirect('/rooms')
}```
TL;DR
Developers are experiencing an issue where the session.secret is empty after the authentication process with OTP in Nextjs 14.2.8 and node-appwrite 13. Creating a new API key did not resolve the problem. Solution: The code needs to populate the session.secret correctly after creating a session with OTP verification.
Mopsior
17 Sep, 2024, 15:15
TypeScript
// @/lib/server/appwrite
"use server"

import { cookies } from "next/headers"
import { Account, Client } from "node-appwrite"

export const createSessionClient = async () => {
    const client = new Client()
        .setEndpoint(process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT as string)
        .setProject(process.env.NEXT_PUBLIC_APPWRITE_PROJECT as string)
    const session = cookies().get('user-session')

    if (!session || !session.value) {
        throw new Error('No session found')
    }

    client.setSession(session.value)
    return {
        get account() {
            return new Account(client)
        }
    }
}

export const createAdminClient = async () => {
    const client = new Client()
        .setEndpoint(process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT as string)
        .setProject(process.env.NEXT_PUBLIC_APPWRITE_PROJECT as string)
        .setKey(process.env.APPWRITE_API_KEY as string)

    return {
        get account() {
            return new Account(client)
        }
    }
}

export const getLoggedInUser = async () => {
    try {
        const { account } = await createSessionClient()
        return await account.get()
    } catch (err) {
        return null
    }
}
TypeScript
{
  '$id': '66e99b59ae204f8cea19',
  '$createdAt': '2024-09-17T15:08:09.719+00:00',
  '$updatedAt': '2024-09-17T15:08:09.719+00:00',
  userId: '66e996ea0020587be57b',
  expire: '2025-09-17T15:08:09.744+00:00',
  provider: 'token',
  providerUid: '',
  providerAccessToken: '',
  providerAccessTokenExpiry: '',
  providerRefreshToken: '',
  ip: '10.0.0.2',
  osCode: 'LIN',
  osName: 'GNU/Linux',
  osVersion: '',
  clientType: '',
  clientCode: '',
  clientName: '',
  clientVersion: '',
  clientEngine: '',
  clientEngineVersion: '',
  deviceName: 'desktop',
  deviceBrand: '',
  deviceModel: '',
  countryCode: '--',
  countryName: 'Unknown',
  current: true,
  factors: [ 'email' ],
  secret: '',
  mfaUpdatedAt: ''
} 
Reply

Reply to this thread by joining our Discord

Reply on Discord

Need support?

Join our Discord

Get community support by joining our Discord server.

Join Discord

Get premium support

Join Appwrite Pro and get email support from our team.

Learn more