A secure-by-default rest api stack implemented with hyper, tokio, bb8 and postgres. This project is focused on providing end-to-end encryption by default for 12-factor applications looking to customize functionality using environment variables as needed. Includes a working user management and authentication backend written in postgresql with async S3 uploading for POST-ed data files.
Component | Status ---------------- | ------ Rest API Server | Listening for encrypted client connections on tcp port 3000 Postgres | Listening for encrypted client connections on tcp port 5432 (tls Certificate Authority required) pgAdmin | Listening for encrypted HTTP client connections on tcp port 5433
bash
git clone https://github.com/jay-johnson/restapi
cd restapi
The repository restapi includes default tls assets, but for security purposes you should generate your own. Please refer to the Generate TLS Assets doc for more information.
Here's how to generate them under the ./certs
directory:
bash
cd certs
./generate-tls-assets.sh -f -c ./configs/dev-network.yml
cd ..
This repo includes default JWT signing keys, but you should generate your own signing keys under the ./jwt
directory with these commands:
bash
cd jwt
openssl ecparam -name prime256v1 -genkey -out private-key.pem
openssl pkcs8 -topk8 -nocrypt -in private-key.pem -out private-key-pkcs8.pem
openssl ec -in private-key.pem -pubout -out public-key.pem
cd ..
Please refer to the How to build JWT private and public keys for the jsonwebtokens crate doc for more information.
Please refer to the Build and Deploy a Secured Postgres backend doc for more information.
bash
cargo build --example server
bash
export RUST_BACKTRACE=1 && export RUST_LOG=info && ./target/debug/examples/server
Here are the supported json contracts for each Request
and Response
based off the url. Each client request is handled by the ./src/handle_requests.rs module and returned as a response back to the client (serialization using serde_json
)
Create a single users
record for the new user
/user
POST
Update supported users
fields (including change user email and password)
/user
PUT
Get a single user by users.id
- by default, a user can only get their own account details
/user/USERID
GET
Delete a single users
record (note: this does not delete the db record, just sets the users.state
to inactive 1
)
/user
DELETE
Search for matching users
records in the db
/user/search
POST
Create a one-time-use password reset token that allows a user to change their users.password
value by presenting the token
/user/password/reset
POST
Consume a one-time-use password and change the user's users.password
value to the new argon2-hashed password
/user/password/change
POST
Consume a one-time-use verification token and change the user's users.verified
value verified (1
)
/user/verify
GET
Upload a local file on disk to AWS S3 asynchronously and store a tracking record in the users_data
table. The documentation refers to this as a user data
or user data file
record.
/user/data
POST
Update the users_data
tracking record for a file that exists in AWS S3
/user/data
PUT
Search for matching records in the users_data
db based off the request's values
/user/data/search
POST
Log the user in and get a json web token (jwt) back for authentication on subsequent client requests
/login
POST
This project focused on integration tests for v1 instead of only rust tests (specifically everything has been tested with curl):
Please refer to the Integration Tests Using curl Guide