Does Django Work With Auth.js?

Partially CompatibleLast verified: 2026-02-20

Django and Auth.js can work together, but you're mixing a Python backend with a JavaScript auth library designed for JavaScript frameworks—it requires building a custom integration layer.

Quick Facts

Compatibility
partial
Setup Difficulty
Moderate
Official Integration
No — community maintained
Confidence
high
Minimum Versions
Django: 3.2
Auth.js: 4.0

How Django Works With Auth.js

Django and Auth.js aren't naturally compatible because Auth.js is purpose-built for JavaScript ecosystems (Next.js, SvelteKit, etc.) while Django is Python-based. However, you can integrate them by using Auth.js in a separate frontend application (Next.js, SvelteKit) that communicates with a Django REST API. Auth.js handles session management and authentication in the JavaScript layer, while Django consumes the authenticated user context via JWT tokens or session headers. The authentication flow goes: Auth.js manages login/logout → issues JWT tokens → frontend sends tokens to Django API → Django validates tokens and serves data. This works well for decoupled architectures but adds operational complexity. Alternatively, you could implement Auth.js callbacks to sync user data back to Django after authentication, storing user records in both systems. This approach is common in microservices patterns where frontend and backend are independently deployed.

Best Use Cases

Decoupled SPA frontend (Next.js/SvelteKit) with Django REST API backend serving multiple clients
Migrating a Django monolith to microservices with a modern JavaScript frontend while keeping legacy backend
Building a Django API that serves both mobile (JWT auth) and web (Auth.js) clients
Teams wanting Auth.js's provider ecosystem (GitHub, Google, etc.) without rewriting Django authentication

Auth.js with Django JWT Backend

bash
npm install next-auth axios
typescript
// pages/api/auth/[...nextauth].ts
import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';
import axios from 'axios';

const DJANGO_API = process.env.NEXT_PUBLIC_DJANGO_API;

export const authOptions = {
  providers: [
    CredentialsProvider({
      async authorize(credentials) {
        try {
          const res = await axios.post(`${DJANGO_API}/api/token/`, {
            username: credentials.username,
            password: credentials.password,
          });
          if (res.data.access) {
            return { id: res.data.user_id, token: res.data.access };
          }
          return null;
        } catch (e) {
          return null;
        }
      },
    }),
  ],
  callbacks: {
    async jwt({ token, user }) {
      if (user) token.accessToken = user.token;
      return token;
    },
    async session({ session, token }) {
      session.accessToken = token.accessToken;
      return session;
    },
  },
};

export default NextAuth(authOptions);

Known Issues & Gotchas

critical

Session/token mismatch: Auth.js creates sessions in JavaScript, Django expects CSRF tokens or Bearer tokens

Fix: Use JWT tokens from Auth.js callbacks, validate them in Django with djangorestframework-simplejwt or similar. Set up CORS properly and ensure Auth.js sends tokens in Authorization headers.

warning

User synchronization: Auth.js and Django may have different user record sources, causing data inconsistency

Fix: Implement a callback in Auth.js that syncs user data to Django after successful authentication, or use a shared database with proper conflict resolution.

warning

Refresh token rotation: Auth.js handles token refresh client-side, but Django needs to validate the new tokens

Fix: Configure Auth.js callbacks to call Django endpoints for token refresh, keeping Django as the source of truth for token validity.

info

No built-in provider integration for Django providers (like Django Allauth backends)

Fix: Either use Auth.js's standard OAuth providers or build custom Auth.js provider adapters that communicate with Django's OAuth endpoints.

Alternatives

  • Django built-in authentication + django-cors-headers + custom JWT implementation (fully Python-native, simpler for Django-only teams)
  • Django + Dj-Rest-Auth + djangorestframework-simplejwt (Django ecosystem solution, loses Auth.js provider ecosystem)
  • Keycloak/Auth0 + Django (dedicated auth service, both Django and JavaScript clients authenticate against it, no custom integration needed)

Resources

Related Compatibility Guides

Explore more compatibility guides