We're so excited you're interested in helping with Authorizer! We are happy to help you get started, even if you don't have any previous open-source experience 😊
- Take a look at How to Contribute to an Open Source Project on GitHub
- Go through the Authorizer Code of Conduct
- Check our Github Issues to see if someone has already answered your question.
- Join our community on Discord and feel free to ask us your questions
As you gain experience with Authorizer, please help answer other people's questions! 🙏
You can get started by taking a look at our Github issues
If you find one that looks interesting and no one else is already working on it, comment on that issue and start contributing 🙂.
Please ask as many questions as you need, either directly in the issue or on Discord. We're happy to help!:raised_hands:
- More tests
- Improved Docs
- Improved error messages
- Educational content like blogs, videos, courses
- OS: Linux or macOS or Windows
- Go >= 1.24 (see
go.mod) - Node.js >= 18 and npm (only if building web app or dashboard)
- Architecture of Authorizer
- GraphQL APIs
- Migration Guide (v1 → v2) – v2 uses CLI-based configuration
- Fork the authorizer repository (Skip this step if you have access to repo)
- Clone repo:
git clone https://github.com/authorizerdev/authorizer.gitor use the forked url from step 1 - Change directory:
cd authorizer - Build the server:
make build(orgo build -o build/authorizer .) - (Optional) Build the web app and dashboard:
make build-appandmake build-dashboard - Run locally:
make dev(uses SQLite and demo secrets for development)
v2: The server does not read from
.env. All configuration is passed via CLI arguments. See MIGRATION.md.
- Modify
internal/graph/schema.graphqls(or other files ininternal/graph/) - Run
make generate-graphqlto regenerate models and resolvers - If a new mutation or query is added, implement the resolver in
internal/graph/(resolver layout follows schema)
- Run
make generate-db-template dbname=NEW_DB_NAME- e.g.
make generate-db-template dbname=dynamodb
- e.g.
This generates a folder in internal/storage/db/ with the specified name. Implement the methods in that folder.
Note: Database connection and schema changes are in
internal/storage/db/DB_NAME/provider.go;NewProvideris called for the configured database type.
Make sure you test before creating a PR.
The main make test target spins up Postgres, Redis, ScyllaDB, MongoDB, ArangoDB, DynamoDB, and Couchbase via Docker, runs the Go test suite, then tears down containers.
For local development without full DB matrix:
make dev # run server for manual testing
go test -v ./... # run tests (requires Docker for full suite)If you are adding a new resolver:
- Create a new test file in
internal/integration_tests/(naming:resolver_name_test.go) - Follow the existing pattern using
getTestConfig()andinitTestSetup()
Command to run full test suite:
make testManual Testing:
For manually testing using graphql playground, you can paste following queries and mutations in your playground and test it
mutation Signup {
signup(
params: {
email: "lakhan@yopmail.com"
password: "test"
confirm_password: "test"
given_name: "lakhan"
}
) {
message
user {
id
family_name
given_name
email
email_verified
}
}
}
mutation ResendEamil {
resend_verify_email(
params: { email: "lakhan@yopmail.com", identifier: "basic_auth_signup" }
) {
message
}
}
query GetVerifyRequests {
_verification_requests {
id
token
expires
identifier
}
}
mutation VerifyEmail {
verify_email(params: { token: "" }) {
access_token
expires_at
user {
id
email
given_name
email_verified
}
}
}
mutation Login {
login(params: { email: "lakhan@yopmail.com", password: "test" }) {
access_token
expires_at
user {
id
family_name
given_name
email
}
}
}
query GetSession {
session {
access_token
expires_at
user {
id
given_name
family_name
email
email_verified
signup_methods
created_at
updated_at
}
}
}
mutation ForgotPassword {
forgot_password(params: { email: "lakhan@yopmail.com" }) {
message
}
}
mutation ResetPassword {
reset_password(
params: { token: "", password: "test", confirm_password: "test" }
) {
message
}
}
mutation UpdateProfile {
update_profile(params: { family_name: "samani" }) {
message
}
}
query GetUsers {
_users {
id
email
email_verified
given_name
family_name
picture
signup_methods
phone_number
}
}
mutation MagicLinkLogin {
magic_link_login(params: { email: "test@yopmail.com" }) {
message
}
}
mutation Logout {
logout {
message
}
}
mutation UpdateUser {
_update_user(
params: {
id: "dafc9400-d603-4ade-997c-83fcd54bbd67"
roles: ["user", "admin"]
}
) {
email
roles
}
}
mutation DeleteUser {
_delete_user(params: { email: "signup.test134523@yopmail.com" }) {
message
}
}