OpenSaasAU / keystone-nextjs-auth

A package that add social auth to Keystone-6 (https://keystonejs.com/) by using next-authjs (https://next-auth.js.org/)
MIT License
75 stars 11 forks source link
auth0 authentication hacktoberfest keystone nextauth nextjs

Package now DEPRECIATED

This package now no longer works with the latest versions of Keystone and Next-Auth. For more background see https://github.com/keystonejs/keystone/pull/8582. You can now implement Next-Auth directly in Keystone - see example https://github.com/keystonejs/keystone/tree/main/examples/custom-session-next-auth

Open in Visual Studio Code Release

Keystone next auth

This package enables the addition of social auth to keystone-6.

Contents

About

This uses NextAuth.js (https://next-auth.js.org/) project to add social auth to Keystone-6 (https://keystonejs.com/). Primary testing has been done with Auth0, happy for others to test other providers/give feedback or send through a PR.

Adding to your project

Add package by yarn add @opensaas/keystone-nextjs-auth then add the following to your keystone.ts:

Add import...

import { createAuth } from '@opensaas/keystone-nextjs-auth';
import Auth0 from '@opensaas/keystone-nextjs-auth/providers/auth0';

Add you Auth configuration including providers for Provider configuration see https://next-auth.js.org/providers/. For Provider configuration replace next-auth/providers/ with @opensaas/keystone-nextjs-auth/providers/

let sessionSecret = process.env.SESSION_SECRET;

if (!sessionSecret) {
  if (process.env.NODE_ENV === 'production') {
    throw new Error(
      'The SESSION_SECRET environment variable must be set in production'
    );
  } else {
    sessionSecret = '-- DEV COOKIE SECRET; CHANGE ME --';
  }
}

const auth = createAuth({
  listKey: 'User',
  identityField: 'subjectId',
  sessionData: `id name email`,
  autoCreate: true,
  resolver: async ({user, profile, account}) => {
    const username = user.name as string;
    const email = user.email as string;
    return { email, username };
  },
  keystonePath: '/admin',
  sessionSecret,
  providers: [
    Auth0({
      clientId: process.env.AUTH0_CLIENT_ID || 'Auth0ClientID',
      clientSecret: process.env.AUTH0_CLIENT_SECRET || 'Auth0ClientSecret',
      domain: process.env.AUTH0_DOMAIN || 'opensaas.au.auth0.com',
    }),
]
});

Wrap your keystone config in auth.withAuth.

export default auth.withAuth(
  config({
    server: {},
    db: {},
    ui: {},
    lists,
    ...
  });

Configuration

Provider configuration see https://next-auth.js.org/configuration/providers. For Keystone-6 Configuration see https://keystonejs.com/ for example see the example backend

Note: The Keystone create-keystone-app CLI app (generally run with yarn create keystone-app/npm init keystone-app) will set a required password field on the User list. If you've used this to set up your project you will need to modify your list schema to set the field as not required, or remove it entirely if you don't plan to use the default Keystone auth system at all.

Contributing

If you want to run this package locally After cloning run yarn install and either:

The Demo App is configured in next.config.js to proxy /api/auth to the the host setup using the environment variable BACKEND_BASE_URL in development set export BACKEND_BASE_URL=http://localhost:3000 you will also need to set your NEXTAUTH_URL environment variable see https://next-auth.js.org/configuration/options for more information.