honojs-middleware/packages/auth-js
Yusuke Wada 7a401b0850
chore: use the latest eslint and `@hono/eslint-config` (#904)
* chore: use the latest eslint and `@hono/eslint-config`

* update codes
2024-12-25 18:08:43 +09:00
..
src chore: use the latest eslint and `@hono/eslint-config` (#904) 2024-12-25 18:08:43 +09:00
test chore: use the latest eslint and `@hono/eslint-config` (#904) 2024-12-25 18:08:43 +09:00
CHANGELOG.md Version Packages (#815) 2024-11-08 04:55:22 +09:00
README.md fix(auth.js): clone request directly for bun (#790) 2024-10-24 18:41:16 +09:00
package.json Version Packages (#815) 2024-11-08 04:55:22 +09:00
tsconfig.json added auth.js middleware (#326) 2023-12-29 04:30:25 +09:00
tsup.config.ts added auth.js middleware (#326) 2023-12-29 04:30:25 +09:00
vitest.config.mts added auth.js middleware (#326) 2023-12-29 04:30:25 +09:00

README.md

Auth.js middleware for Hono

This is a Auth.js third-party middleware for Hono.

This middleware can be used to inject the Auth.js session into the request context.

Installation

npm i hono @hono/auth-js @auth/core

Configuration

Before starting using the middleware you must set the following environment variables:

AUTH_SECRET=#required
AUTH_URL=https://example.com/api/auth

How to Use

import { Hono } from 'hono'
import { authHandler, initAuthConfig, verifyAuth } from '@hono/auth-js'
import GitHub from '@auth/core/providers/github'

const app = new Hono()

app.use(
  '*',
  initAuthConfig((c) => ({
    secret: c.env.AUTH_SECRET,
    providers: [
      GitHub({
        clientId: c.env.GITHUB_ID,
        clientSecret: c.env.GITHUB_SECRET,
      }),
    ],
  }))
)

app.use('/api/auth/*', authHandler())

app.use('/api/*', verifyAuth())

app.get('/api/protected', (c) => {
  const auth = c.get('authUser')
  return c.json(auth)
})

export default app

React component

import { SessionProvider, useSession } from '@hono/auth-js/react'

export default function App() {
  return (
    <SessionProvider>
      <Children />
    </SessionProvider>
  )
}

function Children() {
  const { data: session, status } = useSession()
  return <div>I am {session?.user}</div>
}

Default /api/auth path can be changed to something else but that will also require you to change path in react app.

import { SessionProvider, authConfigManager, useSession } from '@hono/auth-js/react'

authConfigManager.setConfig({
  basePath: '/custom', // if auth route is diff from /api/auth
})

export default function App() {
  return (
    <SessionProvider>
      <Children />
    </SessionProvider>
  )
}

function Children() {
  const { data: session, status } = useSession()
  return <div>I am {session?.user}</div>
}

SessionProvider is not needed with react query.Use useQuery hook to fetch session data.

const useSession = () => {
  const { data, status } = useQuery({
    queryKey: ['session'],
    queryFn: async () => {
      const res = await fetch('/api/auth/session')
      return res.json()
    },
    staleTime: 5 * (60 * 1000),
    gcTime: 10 * (60 * 1000),
    refetchOnWindowFocus: true,
  })
  return { session: data, status }
}

For more details on how to Popup Oauth Login see example

Author

Divyam https://github.com/divyam234