Skip to content

Latest commit

 

History

History
131 lines (101 loc) · 3.86 KB

README.md

File metadata and controls

131 lines (101 loc) · 3.86 KB

Getting started with REST API Web Services in Rust using Axum, JWT, SQLx, PostgreSQL, and Redis

build & test MIT

A sample starter project for building REST API Web service in Rust using axum, JSON Web Tokens (JWT), SQLx, PostgreSQL, and Redis

Covers:

  • REST API server based on axum
    • Routing
    • API versioning
    • API Error responses (structured format)
    • Cross-Origin Resource Sharing (CORS)
    • Graceful shutdown
  • API Endpoints
    • Health
    • Version
    • Authentication
    • Users
    • Accounts
    • Transactions
  • Authentication & authorization using JSON Web Tokens (JWT)
    • Login, logout, refresh, and revoking operations
    • Role based authorization
    • Generating and validating access and refresh tokens
    • Setting tokens expiry time (based on configuration)
    • Using refresh tokens rotation technique
    • Revoking issued tokens by using Redis (based on configuration)
      • Revoke all tokens issued until the current time
      • Revoke tokens belonging to the user issued until the current time
      • Cleanup of revoked tokens
  • Using PostgreSQLdatabase with SQLx
    • Database migrations
    • Async connection pooling
    • Async CRUD operations and transactions
  • Using Redis in-memory storage
    • Async Redis operations
  • Configuration settings
    • Loading and parsing .env file
    • Using environment variables
  • Logs
    • tracing based logs
  • Tests
    • End-to-end API tests
    • Database isolation in tests
  • Using Docker
    • Running PostgreSQL and Redis services
    • Building the application using the official Rust image
    • Running the full stack: API + PostgreSQL + Redis
  • GitHub CI configuration
    • Running cargo deny to check for security vulnerabilities and licenses
    • Running cargo fmt to check for the Rust code format according to style guidelines
    • Running cargo clippy to catch common mistakes and improving the Rust code
    • Running tests
    • Building the application

Run

Running the REST API service (debug release):

docker-compose up -d
cargo run

Running the Docker based full stack build: docker-compose.full.yml

docker-compose -f docker-compose.full.yml up -d

REST API endpoints

Please check for the list of available REST API endpoints: tests/endpoints.http

REST API endpoints can be easily tested using following tools:

  • REST Client for Visual Studio Code.

  • curl samples:

    Health check

    curl -i http://127.0.0.1:8080/v1/health

    Login

    curl -i http://127.0.0.1:8080/v1/auth/login \
    -H "Content-Type: application/json" \
    -d '{"username":"admin","password_hash":"7c44575b741f02d49c3e988ba7aa95a8fb6d90c0ef63a97236fa54bfcfbd9d51"}'

    List of users

    curl -i http://127.0.0.1:8080/v1/users \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkNTFlNjE4Ny1jYmFjLTQ0ZmEtOWE5NS04ZjFkZWJkYmFlZWEiLCJqdGkiOiIwN2Y3OWE0OC1kMWFhLTQ1ZjItOWE5NS05Y2M5MGZiY2UyYTciLCJpYXQiOjE3MzYwMTA3MjIsImV4cCI6MTczNjAxNDMyMiwidHlwIjowLCJyb2xlcyI6ImFkbWluIn0.3f2c_5PyPXMhgu0FIX4--SGjnSDW1GLxL0ba6gSImfM"

Tests

REST API tests: /tests

Running tests:

docker-compose up -d
cargo test

Running the service in test configuration:

ENV_TEST=1 cargo run

Logging

Setting the RUST_LOG - logging level on the launch:

RUST_LOG=info,hyper=debug,axum_web=trace cargo run

Project Stage

Development: this project is under development.