Skip to content

Repository files navigation

tinyauth is a very tiny passwordless GraphQL authentication service. tinyauth keeps authentication simple with 3 easy steps.

(This is a toy, don't use for production)

Step 1

  • sends code to user's phone
mutation {
sendVerification(phone: "+15559993478", message: "Howdy! your code is") {
status # 200message # verification sentsuccess # true
}
}

Step 2

  • verify phone with code user received as sms
mutation {
verifyUser(verification: { phone: "+15559993478", code: "555555" }) {
statusmessagesuccessauth # auth jwt to include in future headers
}
}

Step 3

  • place jwt in headers {"auth": "auth-jwt-from-last-step"}

  • run the getMe query

{
getMe {
idphone
}
}

Develop

Set up your .aws credentials, make a DynamoDB table named tinyauth-dev

Install node (to run serverless-offline). I use nvm to manage my node versions.

Go to your tinyauth-api folder:

touch .env

Add TABLE_NAME and API_SECRET environment variables.

TABLE_NAME=my-app-devAPI_SECRET=somethingsecret

npm install

virtualenv -p python3 venv

source venv/bin/activate

pip install -r requirements.txt

sls deploy - will automatically make your dynamodb table on aws.

sls wsgi serve -p 8000 or yarn run start

Run queries in Graphi at http://localhost:8000/graphql

Run Tests

TABLE_NAME=tinyauth-test API_SECRET=somethingsecret python -m pytest or yarn run test

Deploy

Update your table name / secret in .env and run

sls deploy

No GraphQL Client?

Send verification

importrequestsvariables= {'phone': '+155555555555'}
mutation="""mutation SendVerification($phone: String!) { sendVerification(phone: $phone) { status message success }}"""# or localhost:8000 for devrequests.post('https://tinyauth.io/graphql', json={'query': mutation, 'variables': variables})

Verify user

importrequestsvariables= {'phone': '+155555555555', 'code': '555555'}
mutation="""mutation VerifyUser($phone: String!, $code: String!) { verifyUser(verification: { phone: $phone, code: $code }) { status message success auth # auth jwt to include in future headers }}"""# or localhost:8000 for devrequests.post('https://tinyauth.io/graphql', json={'query': mutation, 'variables': variables})

Get Me

importrequestsheaders= {
"auth": your-tinyauth-jwt
}
query="""{ getMe { id phone }}"""# or localhost:8000 for devrequests.post('https://tinyauth.io/graphql', json={'query': query}, headers=headers)

About

📱 A tiny passwordless SMS authentication service using Flask, JWT, Serverless, DynamoDB, Ariadne GraphQL

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages