DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Newsletter
Log In / Join
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Related

  • How to Build a Full-Stack App With Next.js, Prisma, Postgres, and Fastify
  • Lessons Learned Moving From On-Prem to Cloud Native
  • Idempotency Under Concurrency: Why Your Application Check Isn't the Last Line of Defense
  • Running a Self-Hosted WAF in Production: Practical Lessons From SafeLine

Trending

  • Part 3: End-to-End Tracing and Observability Across Goose, agentgateway, and Quarkus
  • How You Clear Your HTML5 Canvas Matters
  • ScyllaDB in Enterprise Java: High-Performance NoSQL With Eclipse JNoSQL
  • Replay, Scheduling, and Throttling: Engineering a Self-Service Kafka Streaming Tool at Scale

Draft This article hasn't been published, so readers can't see it.

In moderation This article is waiting for review, so readers can't see it yet.

Deleted This article has been deleted, so readers can't see it.

  1. DZone
  2. Coding
  3. JavaScript
  4. Serverless Sign-In Solution Based on Next.js on CloudFare

Serverless Sign-In Solution Based on Next.js on CloudFare

How to set up your sign-in solution on CloudFare pages by using Next.js, NextAuth D1, and Prisma. The source code and the link to the working demo are provided.

By 
Bogdan Nechyporenko
DZone Core CORE ·
Mar. 19, 25 · Tutorial
Post on X (opens in a new tab) Share on LinkedIn (opens in a new tab)
4.9K Views

Join the DZone community Save articles, join the discussion, and download Refcards and Trend Reports with a free account.

Join for free Already a member? Log in

If you would like to run your own solution without any costs and get familiar with serverless architecture, I'd encourage you to look at CloudFare. 

Recently, I tried to assemble all the pieces together to make the Next.js application authorization work on Cloudflare and faced a lot of issues. Provided examples on the official site and demos on other sources were working only partially. After some digging and combining the pieces together, it finally started working.

You could also look at the source code and working demo.

Note to all impatient readers

For the rest who would like to know what to do to get your own setup up and running, let's begin.

First, create your account on CloudFare. It's completely free and very straightforward to do.

Number one on the list — check!

Now, you can clone the demo project with: 

Plain Text
 
git clone 


You can find the instructions in the Readme.md file and what you have to do there. There are multiple ways how you can run the project.

If you want to run it with hot reload, you'd better use:

Plain Text
 
pnpm run dev


But be aware that if the project runs with this command, it doesn't guarantee it will work on CloudFare. To be sure that when you deploy, it will work, you can verify it locally with:

Plain Text
 
pnpm run preview


But with this mode, you can't enjoy your hot-reloading capabilities and building time significantly longer. So, I would not use it during the active development.

In CloudFare, you can run your applications as Pages and also as Workers. I chose to run it as a Page because Workers have a limitation of 3 MB on a free tier. With the Next.js application, it's very easy to reach this threshold. It also means that if you'd like to add backend API, you have to create a Worker application and create a binding between Worker and Page.

Now, about the quirks you may come across when trying to create the same application from other sources:

Uh oh!

In auth.ts, you'll find an example to configure it as:

TypeScript
 
const authResult = async (): Promise<NextAuthResult> => {
  return NextAuth({
    providers: [
      Resend({
        apiKey: (await getCloudflareContext()).env.AUTH_RESEND_KEY,
        from: (await getCloudflareContext()).env.AUTH_EMAIL_FROM,
      }),
    ],
    adapter: D1Adapter((await getCloudflareContext()).env.DB),
  });
};


Notice the line:

Plain Text
 
D1Adapter((await getCloudflareContext()).env.DB),


This will not work!

Oof, what a bummer!

The latest version of NextAuth doesn't allow to do it as it treats it as an invocation in the root of the file. 

Also, be careful with getting the context. In the example above:

  • For Workers, it is getCloudflareContext().
  • For Pages, it is getRequestContext().

You can't mix them; otherwise, it will be borked.

Oof!

The next issue is with NextAuth when you deal with signing in the user and redirecting it to the page. I've seen many suggestions in StackOverflow, but what seems to work the best is:

TypeScript
 
try {
  await signIn("credentials", {
    email: formData.get("email") as string,
  });
} catch (error) {
  if (error?.hasOwnProperty("digest")) {
      throw error;
   }
}


What's going on here? 

Hmm...

signIn actually throws the exception always! It doesn't really matter if the user signed in successfully or not. But, to let the error propagate when the user signs in, it works well, and the page is redirected how it should. 

In the case of failure we use an extra logic for that. As this is a server-side component, there are not many options how to display the error to users. I used the solution to pass the information via cookie, because useState, useEfffect, and other hooks work only for client-side components.

One more thing to be aware of: I was very surprised to see that it matters which package manager to use. When I used npm, I've seen very weird errors. Also, do not mix invocation of different package managers — first pnpm, then npm, or yarn. It can make your application not work after.

Happy coding, and let me know if you'd like to share with me your experience with this tech stack and the challenges on the way with it!

What did you think of my article?

Next.js application Npm (software)

Opinions expressed by DZone contributors are their own.

Related

  • How to Build a Full-Stack App With Next.js, Prisma, Postgres, and Fastify
  • Lessons Learned Moving From On-Prem to Cloud Native
  • Idempotency Under Concurrency: Why Your Application Check Isn't the Last Line of Defense
  • Running a Self-Hosted WAF in Production: Practical Lessons From SafeLine

Partner Resources

×

Comments

Loading comments

The comments didn't load

Please try again in a moment.

Likes

Loading

The next likes didn't load. Please try again.

The likes didn't load

Please try again in a moment.

See who liked this

Log in or join DZone for free to see who liked this article.

Log in Join for free
  • RSS
  • X
  • Facebook

ABOUT US

  • About DZone
  • Support and feedback
  • Community research

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Core Program
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 3343 Perimeter Hill Drive
  • Suite 215
  • Nashville, TN 37211
  • [email protected]

Let's be friends:

  • RSS
  • X
  • Facebook