Skip to content

Add Nuxt (H3 + Nitro) Example #176

@dan-hale

Description

@dan-hale

Nuxt uses Nitro and (H3)[https://v1.h3.dev/] from the UnJS ecosystem to handle server side processing. See Nuxt Server Engine

I want to provide the following files in my /server/routes/oauth2 folder as a starting point to build an Nitro JS handler.
This example code does not demonstrate proper user account and scope authorization and therefor should not be used in production

authorize.get.ts

import { serverSupabaseUser } from '#supabase/server'
import { isOAuthError } from '@jmondi/oauth2-server'
import { authorizationServer } from '../../utils/server'

export default defineEventHandler(async (event) => {
  const user = await serverSupabaseUser(event)
  const headers = await getHeaders(event)
  const query = await getQuery(event)

  if (!user) return sendError(event, { statusCode: 401, message: 'Not logged in', name: 'Unauthorized' })

  try {
    const oauthResponse = await authorizationServer.validateAuthorizationRequest({ body: {}, headers, query })
    oauthResponse.user = user
    oauthResponse.isAuthorizationApproved = true
    const response = await authorizationServer.completeAuthorizationRequest(oauthResponse)
    setResponseStatus(event, response.status)
    setHeaders(event, response.headers)
    return response.body
  }
  catch (error: unknown) {
    console.error(error)
    if (isOAuthError(error)) throw createError(error)
    throw error
  }
})

token.post.ts

import { isOAuthError } from '@jmondi/oauth2-server'
import { authorizationServer } from '../../utils/server'

export default defineEventHandler(async (event) => {
  const body = await readBody(event)
  const headers = await getHeaders(event)
  const query = await getQuery(event)

  try {
    const response = await authorizationServer.respondToAccessTokenRequest({ body, headers, query })
    setResponseStatus(event, response.status)
    setHeaders(event, response.headers)
    return response.body
  }
  catch (error: unknown) {
    console.error(error)
    if (isOAuthError(error)) throw createError(Object.assign(error, { data: { query, body } }))
    throw error
  }
})

@jasonraimondi I would love to take on building some functions or even a nuxt module implementation of this. While this code here servers as a starting point if someone else wants to make suggestions or take it on before I have the time.

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions