Skip to content

Auth Service API Endpoints

Bobby Curley edited this page Oct 16, 2025 · 3 revisions
Action Method Endpoint Description
Register POST /auth/register/ Registers a new user with a username, email, and password. Password is not stored, only used to derive auth key which gets stored with the user.
Login POST /auth/login/ Authenticates an existing user and issues JWT access and refresh tokens.
Token Refresh POST /auth/token/ Refreshes an expired token using a refresh token.
Logout POST /auth/logout/ Invalidate a current refresh token by blacklisting it.

POST /auth/register/

Registers a new user with a username, email address, and password

Request Body:

{
    "username": "bcurley",
    "email": "curleyr@oregonstate.edu",
    "password": "ThisIsMyStrongPassword123",
    "password2": "ThisIsMyStrongPassword123"
}

Success Response (201 Created):

{
    "username": "bcurley",
    "email": "curleyr@oregonstate.edu",
    "auth_key": "77947b924dad00d15e811c3bc7372a6d710cec078d6785a24d9b254d961c26e3"
}

Error Response (400 Bad Request):

Duplicate username

{
    "username": [
        "A user with that username already exists."
    ]
}

Mismatched passwords

{
    "password": [
        "Password fields didn't match."
    ]
}

Invalid email address syntax

{
    "email": [
        "Enter a valid email address."
    ]
}

Missing required field

{
    "username": [
        "This field is required."
    ],
    "email": [
        "This field is required."
    ],
    "password": [
        "This field is required."
    ],
    "password2": [
        "This field is required."
    ]
}

POST /auth/login/

Authenticate an existing user and issue a JWT Bearer access/refresh token.

Request Body:

{
  "username": "bcurley",
  "password": "ThisIsMyStrongPassword123"
}

Success Response (200 OK):

{
    "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYwMzc5OTkxLCJpYXQiOjE3NjAzNzkwOTEsImp0aSI6ImE3YTc5OTEwMzI0ODQ1YWViZmY0YjhkOGNiOWM0OGQ4IiwidXNlcl9pZCI6IjMifQ.tIyDetkhksQQckDZT1rj3-kk6BHC5W2Wbe5dmmVBEag",
    "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTc2MDQ2NTQ5MSwiaWF0IjoxNzYwMzc5MDkxLCJqdGkiOiI4ZGMwOWFhMGE0YTE0YjE0YTA1YmY2OTc3OTc4YTRmMiIsInVzZXJfaWQiOiIzIn0.aBSE7wLcrTw_7j6Mbrg8LGMMZzgzh-6xCbJTmKJEBdQ",
    "type": "Bearer",
    "expires_in": 900
}

Error Response (400 Bad Request):

Invalid username or password

{
    "non_field_errors": [
        "Invalid username or password."
    ]
}

User doesn't exist

{
    "non_field_errors": [
        "User does not exist"
    ]
}

Missing required field

{
    "username": [
        "This field is required."
    ],
    "password": [
        "This field is required."
    ]
}

POST /auth/token/

Refresh an expired token using a refresh token

Request Body:

{
    "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTc2MDQ2NTQ5MSwiaWF0IjoxNzYwMzc5MDkxLCJqdGkiOiI4ZGMwOWFhMGE0YTE0YjE0YTA1YmY2OTc3OTc4YTRmMiIsInVzZXJfaWQiOiIzIn0.aBSE7wLcrTw_7j6Mbrg8LGMMZzgzh-6xCbJTmKJEBdQ"
}

Success Response (200 OK):

{
    "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYwMzgwMDEyLCJpYXQiOjE3NjAzNzkxMTIsImp0aSI6IjEyYjdlZjNmZWUwMDQ1ZmY4MTc5OGI1MjNiYTU3ZDQ2IiwidXNlcl9pZCI6IjMifQ.F0jGR3e5cj37q2Tk9blEl4pfyJADPWq7xoxEr0zJXwo",
    "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTc2MDQ2NTUxMiwiaWF0IjoxNzYwMzc5MTEyLCJqdGkiOiIxMjFlMjZhMzk2OTY0ZjU0OTQ2ZWZkYmNjOTM2NTM5OCIsInVzZXJfaWQiOiIzIn0.VHosO2VG51BxTJ1XJuOrSLeRyfcqaEVb-8xmXHppoEg"
}

Error Response (400 Bad Request):

Invalid token

{
    "detail": "Token is invalid",
    "code": "token_not_valid"
}

Blacklisted token

{
    "detail": "Token is blacklisted",
    "code": "token_not_valid"
}

Missing required field

{
    "refresh": [
        "This field is required."
    ]
}

POST /auth/logout/

Invalidate current refresh token by blacklisting it

Success Request Body (200 OK):

{}

Error Response (400 Bad Request):

Blacklisted token

{
    "detail": "Token is blacklisted",
    "code": "token_not_valid"
}

Missing required field

{
    "refresh": [
        "This field is required."
    ]
}