auth endpoints

wallet-based authentication via solana signature

POST

/auth/nonce

generate a nonce for wallet signature authentication

request body

{
  "walletAddress": "935yewyPF61Zh1sGa7RsBweHmyVQVnWfzXyyozxjcKXA"
}

response

{
  "nonce": "abc123def456...",
  "message": "Sign this message to authenticate with NeuraNET\n\nWallet: 935ye...cKXA\nNonce: abc123...\nTimestamp: 2024-01-15T10:30:00Z",
  "expiresAt": 1705312200000
}
POST

/auth/verify

verify wallet signature and get access tokens

request body

{
  "walletAddress": "935yewyPF61Zh1sGa7RsBweHmyVQVnWfzXyyozxjcKXA",
  "signature": "base64_encoded_signature...",
  "message": "Sign this message to authenticate..."
}

response

{
  "user": {
    "id": "user_abc123",
    "walletAddress": "935yewy...",
    "isOperator": false,
    "createdAt": "2024-01-15T10:30:00Z"
  },
  "accessToken": "eyJhbGciOiJIUzI1NiIs...",
  "refreshToken": "eyJhbGciOiJIUzI1NiIs...",
  "expiresAt": 1705315800000
}
POST

/auth/refresh

refresh access token using refresh token

request body

{
  "refreshToken": "eyJhbGciOiJIUzI1NiIs..."
}

response

{
  "accessToken": "eyJhbGciOiJIUzI1NiIs...",
  "refreshToken": "eyJhbGciOiJIUzI1NiIs...",
  "expiresAt": 1705315800000
}
GET

/auth/me

get current authenticated user

headers

Authorization: Bearer <access_token>

response

{
  "user": {
    "id": "user_abc123",
    "walletAddress": "935yewy...",
    "isOperator": true,
    "createdAt": "2024-01-15T10:30:00Z"
  }
}

error codes

INVALID_WALLET_ADDRESS400
NONCE_EXPIRED400
INVALID_SIGNATURE401
TOKEN_EXPIRED401
INVALID_REFRESH_TOKEN401