npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@propelauth/nextjs

v0.1.11

Published

[PropelAuth](https://www.propelauth.com?utm_source=github&utm_medium=library&utm_campaign=nextjs) is a user management and authentication service for your B2B/multi-tenant applications.

Downloads

9,857

Readme

PropelAuth Next.js (v13+) Library

PropelAuth is a user management and authentication service for your B2B/multi-tenant applications.

This library provides a simple way to integrate your Next.js application (either AppRouter or Pages) with PropelAuth.

Next.js SSR/AppRouter support is currently in beta.

Installation

npm install @propelauth/nextjs

Setup

Before you start, make sure you have a PropelAuth account. You can sign up for free at here.

You'll need to set the following .env variables in your Next.js application:

  • NEXT_PUBLIC_AUTH_URL
  • PROPELAUTH_API_KEY
  • PROPELAUTH_VERIFIER_KEY
  • PROPELAUTH_REDIRECT_URI

You can find the NEXT_PUBLIC_AUTH_URL, PROPELAUTH_API_KEY, and PROPELAUTH_VERIFIER_KEY variables for your application in the PropelAuth Dashboard under Backend Integration.

When you copy the PROPELAUTH_VERIFIER_KEY from the PropelAuth dashboard, it will automatically paste into your .env file with line breaks. However, due to the way some systems interpret multiline environment variables, you will need to edit the verifier key value to include ‘\n’ instead of newline characters. For example:

PROPELAUTH_VERIFIER_KEY=-----BEGIN PUBLIC KEY-----\nMIIBIjANBgk...

For the PROPELAUTH_REDIRECT_URI variable, you need to add /api/auth/callback to the end of one of your allowed frontend locations. So, for example, if you are developing in the test environment and using http://localhost:3000, you would use http://localhost:3000/api/auth/callback

1. Set up routes

In your src/app/api/auth/[slug] directory, create a file called route.ts with the following content:

import {getRouteHandlers} from "@propelauth/nextjs/server/app-router";
import {NextRequest} from "next/server";

// postLoginRedirectPathFn is optional, but if you want to redirect the user to a different page after login, you can do so here.
const routeHandlers = getRouteHandlers({
    postLoginRedirectPathFn: (req: NextRequest) => {
        return "/"
    }
})
export const GET = routeHandlers.getRouteHandler
export const POST = routeHandlers.postRouteHandler

2. Set up AuthProvider

App Router

In your root layout, src/app/layout.tsx, add the AuthProvider:

export default async function RootLayout({children}: {children: React.ReactNode}) {
    return (
        <html lang="en">
        <AuthProvider authUrl={process.env.NEXT_PUBLIC_AUTH_URL}>
            <body className={inter.className}>{children}</body>
        </AuthProvider>
        </html>
    )
}

Pages Router

In your _app.tsx file, add the AuthProvider:

export default function MyApp({Component, pageProps}: AppProps) {
    return (
        <AuthProvider authUrl={process.env.NEXT_PUBLIC_AUTH_URL}>
            <Component {...pageProps} />
        </AuthProvider>
    )
}

3. Set up middleware (App Router only - skip if using Pages)

In your src/middleware.ts file, add the following:

import {authMiddleware} from "@propelauth/nextjs/server/app-router";

export const middleware = authMiddleware

// The middleware is responsible for keeping the user session up to date.
// It should be called on every request that requires authentication AND /api/auth/.* routes.
export const config = {
    matcher: [
        // REQUIRED: Match all request paths that start with /api/auth/
        '/api/auth/(.*)',
        // OPTIONAL: Don't match any static assets
        '/((?!_next/static|_next/image|favicon.ico).*)',
    ],
}

Usage

Get the user in Server Components (App Router example)

import {getUser} from "@propelauth/nextjs/server/app-router";

const WelcomeMessage = async () => {
    const user = await getUser()
    
    if (user) {
        return <div>Hello {user.firstName}!</div>
    } else {
        return <div>Please log in to be welcomed</div>
    }
}
import {getUserOrRedirect} from "@propelauth/nextjs/server/app-router";

const WelcomeMessage = async () => {
    // If the user is not logged in, they will be redirected to the login page
    const user = await getUserOrRedirect()
    
    return <div>Hello {user.firstName}!</div>
}

Get the user in getServerSideProps (Pages example)

import {GetServerSideProps, InferGetServerSidePropsType} from "next";
import {getUserFromServerSideProps} from "@propelauth/nextjs/server/pages";
import {User} from "@propelauth/nextjs/client";

export default function WelcomeMessage({userJson}: InferGetServerSidePropsType<typeof getServerSideProps>) {
    // Deserialize the user from the JSON string so you can call functions like user.getOrg()
    const user = User.fromJSON(userJson)
    return <div>Hello, {user.firstName}</div>
}

export const getServerSideProps: GetServerSideProps = async (context) => {
    const user = await getUserFromServerSideProps(context)
    if (!user) {
        return {redirect: {destination: '/api/auth/login', permanent: false}}
    }
    return { props: {userJson: JSON.stringify(user) } }
}

Get the user in API Routes (Pages example)

import {NextApiRequest, NextApiResponse} from "next";
import {getUserFromApiRouteRequest} from "@propelauth/nextjs/server/pages";

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
    const user = await getUserFromApiRouteRequest(req, res)
    if (user) {
        res.status(200).json({email: user.email})
    } else {
        res.status(401).json({error: "unauthorized"})
    }
}

Get the user in Client Components

"use client";

import {useUser} from "@propelauth/nextjs/client";

const WelcomeMessage = () => {
    const {loading, user} = useUser()
   
    if (loading) {
        return <div>Loading...</div>
    } else if (user) {
        return <div>Hello {user.firstName}!</div>
    } else {
        return <div>Please log in to be welcomed</div>
    }
}

Checking organization membership / RBAC

Note that this works on both the client's User object or the client/server UserFromToken object, but the below example is on the server.

If you are curious where the organization information comes from, check out our documentation on organizations. The quick answer is:

  • PropelAuth provides UI for users to create organizations and invite other users to join them.
  • Your users can also create Enterprise SSO/SAML connections to their own Identity Providers (IdPs) so their organization members can log in with their existing work credentials.
  • You can create organizations and add users to them via our APIs or our Dashboard.
// src/app/org/[slug]/page.tsx
import {getUserOrRedirect} from "@propelauth/nextjs/server/app-router";

export default async function AdminOnlyPage({ params }: { params: { slug: string } }) {
    const user = await getUserOrRedirect()
    const org = user.getOrgByName(params.slug);
    const isAdmin = org?.isRole("Admin")

    if (!isAdmin) {
        return <div>Not found</div>
    } else {
        return <div>Welcome {user.firstName}, Admin of {org?.orgName}</div>
    }
}

Logging out

"use client"

import {useLogoutFunction} from "@propelauth/nextjs/client";

export default function LogoutButton() {
    const logoutFn = useLogoutFunction()
    return <button onClick={logoutFn}>Logout</button>
}

Logging in / Signing up

If you don't want to use redirect functions, you can also use useHostedPageUrls which will return the URLs instead of redirecting.

"use client"

import {useRedirectFunctions} from "@propelauth/nextjs/client";

export default function SignupAndLoginButtons() {
    const {redirectToSignupPage, redirectToLoginPage} = useRedirectFunctions()
    return <>
        <button onClick={redirectToSignupPage}>Sign up</button>
        <button onClick={redirectToLoginPage}>Log in</button>
    </>
}

Redirecting to Account / Org pages

PropelAuth also provides you with pre-built account and organization management UIs. You can redirect your users to these pages by using the following functions:

"use client"

import {useRedirectFunctions} from "@propelauth/nextjs/client";

export default function AccountAndOrgButtons() {
    const {redirectToAccountPage, redirectToOrgPage} = useRedirectFunctions()
    return <>
        <button onClick={redirectToAccountPage}>Account</button>
        <button onClick={redirectToOrgPage}>Organization</button>
    </>
}

Using APIs

You can use our APIs like so:

import {getPropelAuthApis} from "@propelauth/nextjs/server";

const apis = getPropelAuthApis()
await apis.disableUser(userId)

Making a call to an external API

PropelAuth also supports backend that are not Next.js. To make an authenticated request to an external API, you'll need an access token. You can get an access token on the frontend from the useUser hook:

import {useUser} from "@propelauth/nextjs/client";

const MyComponent = () => {
    const {loading, accessToken} = useUser()
    
    // Make a request to an external API with useEffect, useQuery, etc.
}

Within the App Router, you can also call getAccessToken to get the access token.