nikhildhokaN
Convex Community14mo ago
4 replies
nikhildhoka

/authenticate route to get the Bearer Token of the user given their username and pass using Clerk

How can I fix this httpAction to use Clerk to get the Bearer token of the user based on the username and password that the user will provide in the request body of the api call to convex:
import { httpAction } from "../_generated/server";
import { Clerk } from "@clerk/clerk-js";

export const authenticateHandler = httpAction(async (ctx, request) => {
  try {
    // Parse the request body
    const { User, Secret } = await request.json();

    // Authenticate the user using Clerk's users API
    const user = await clerk.users.verifyPassword({ identifier: User, password: Secret });

    if (user) {
      // Create a session for the authenticated user
      const session = await clerk.sessions.createSession({ userId: user.id });

      // Retrieve the session token
      const token = session.token;

      // If authentication is successful, return the token
      return new Response(JSON.stringify({
        token: token,
      }), { status: 200 });
    }
  } catch (error: any) {
    if (error.message.includes("invalid credentials")) {
      // Return 401 if the user or password is invalid
      return new Response("The user or password is invalid.", { status: 401 });
    }
    
    // If any required fields are missing, return 400
    if (error.message.includes("missing fields")) {
      return new Response("There is missing field(s) in the AuthenticationRequest or it is formed improperly.", { status: 400 });
    }

    // Return 501 if the system does not support authentication
    return new Response("This system does not support authentication.", { status: 501 });
  }

  // Ensure a Response is returned if no other conditions are met
  return new Response("An unexpected error occurred.", { status: 500 });
    // return new Response(JSON.stringify({messsage: "Hello world!"}), {
    //     status: 200,
    //     });
});
Was this page helpful?