OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-booking / lib / routes / auth.js

57 lines · javascript ref:
/**
 * Auth routes — challenge endpoint + identity management.
 */

import { json, readJson } from '../response.js'

export function registerAuthRoutes (router, server) {
  // Get challenge for signing
  router.get('/api/auth/challenge', async (req, res) => {
    const challenge = await server.authManager.challengeManager.generate()
    json(res, challenge)
  })

  // Create identity (register with username)
  router.post('/api/auth/identity', async (req, res) => {
    const body = await readJson(req)
    const { publicKey, username } = body

    if (!publicKey) {
      json(res, { error: 'publicKey required' }, 400)
      return
    }

    // Auto-register via WebIdentityProvider happens on first authenticated request.
    // This endpoint allows setting a username.
    if (username) {
      const auth = await server.authManager.authenticate(req)
      if (auth) {
        await server.authManager.identityRegistry.setUsername(auth.userId, username)
        json(res, { ok: true, username })
        return
      }
    }

    json(res, { ok: true })
  })

  // Get current user info
  router.get('/api/auth/me', async (req, res) => {
    const auth = await server.authManager.authenticate(req)
    if (!auth) {
      json(res, { authenticated: false })
      return
    }

    const user = auth.user || null
    json(res, {
      authenticated: true,
      userId: auth.userId,
      method: auth.method,
      permissions: auth.permissions,
      username: user ? user.username : auth.username,
      role: auth.permissions && auth.permissions.admin ? 'admin' : 'user'
    })
  })
}