{"id":19589687,"url":"https://github.com/flolu/auth","last_synced_at":"2025-10-17T20:24:42.880Z","repository":{"id":65624976,"uuid":"389004912","full_name":"flolu/auth","owner":"flolu","description":"🔐 Refresh/Access Token Authentication Demo with Client Side Rendering, Server Side Rendering and Websockets","archived":false,"fork":false,"pushed_at":"2022-10-30T06:22:41.000Z","size":719,"stargazers_count":129,"open_issues_count":0,"forks_count":29,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-05-01T19:27:36.742Z","etag":null,"topics":["access-token","authentication","docker","docker-compose","gcp","google-cloud","jsonwebtoken","kubernetes","nexjts","nodejs","refresh-token","server-side-rendering","terraform","typescript","websockets"],"latest_commit_sha":null,"homepage":"https://youtu.be/xMsJPnjiRAc","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flolu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"custom":["https://flolu.de/donations"]}},"created_at":"2021-07-24T05:01:30.000Z","updated_at":"2024-04-20T08:10:21.000Z","dependencies_parsed_at":"2023-02-01T10:47:04.275Z","dependency_job_id":null,"html_url":"https://github.com/flolu/auth","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flolu%2Fauth","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flolu%2Fauth/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flolu%2Fauth/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flolu%2Fauth/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flolu","download_url":"https://codeload.github.com/flolu/auth/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224070362,"owners_count":17250649,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["access-token","authentication","docker","docker-compose","gcp","google-cloud","jsonwebtoken","kubernetes","nexjts","nodejs","refresh-token","server-side-rendering","terraform","typescript","websockets"],"created_at":"2024-11-11T08:20:16.884Z","updated_at":"2025-10-17T20:24:37.844Z","avatar_url":"https://github.com/flolu.png","language":"TypeScript","funding_links":["https://flolu.de/donations"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eFullstack Authentication\u003c/h1\u003e\n  \u003cp\u003eAccess/Refresh Token Authentication Demo with Node.js And Typescript\u003c/p\u003e\n  \u003ca href=\"https://youtu.be/xMsJPnjiRAc\"\u003e\n    \u003cimg width=\"320px\" height=\"180px\" src=\"https://img.youtube.com/vi/xMsJPnjiRAc/mqdefault.jpg\" style=\"border-radius: 1rem;\" /\u003e\n    \u003cp\u003eWatch the YouTube Tutorial\u003c/p\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n# Stack\n\n**Backend**: Node.js, Typescript, MongoDB, Kubernetes\n\n**Frontend**: Next.js, Typescript\n\n**DevOps**: Docker, Terraform, Kubernetes, Google Cloud\n\n# Usage\n\n**Requirements**: Docker, Docker Compose, Yarn, Node.js\n\n**Optional**: Terraform, Google Cloud SDK\n\n**Setup**\n\n- `make setup`\n- Create GitHub OAuth app [here](https://github.com/settings/developers)\n  - Set \"Homepage URL\" to `http://localhost:3000`\n  - Set \"Authorization callback URL\" to `http://localhost:3000/github`\n  - Set `GITHUB_CLIENT_ID` in [`.env.development`](.env.development)\n  - Set `NEXT_PUBLIC_GITHUB_CLIENT_ID` in [`client/.env.development`](client/.env.development)\n  - \"Generate a new client secret\"\n  - Set `GITHUB_CLIENT_SECRET` in [`.env.development`](.env.development)\n\n**Development**\n\n- `make client` (Start Next.js development server, http://localhost:3000)\n- `make backend` (Start development backend services)\n\n# Codebase\n\n**Services**\n\n- [`client`](client) **Next.js client** (web application)\n- [`api`](api) **Node.js server** (http api)\n- [`realtime`](realtime) **Node.js server** (websocket server)\n- [`shared`](shared) **Typescript lib** (shared code)\n- [`infrastructure`](infrastructure) **Terraform** (configurations to deploy application in the cloud)\n\n# Deployment\n\n**Commands**\n\n- `make init-infrastructure` (Initialize Terraform)\n- `make apply` (Apply cloud resources, ~15 minutes)\n- `make deploy` (Build and deploy services to Kubernetes cluster)\n- `make destroy` (Destroy cloud resources)\n- `make client-image` (Build and push client Docker image)\n- `make api-image` (Build and push api Docker image)\n- `make realtime-image` (Build and push Docker image)\n\n**Step by step guide**\n\n1. Configure variables in [`Makefile`](Makefile)\n   - `GCP_PROJECT` You can create a project [here](https://console.cloud.google.com)\n   - `TF_BUCKET` Choose a unique bucket name for Terraform state\n   - `EMAIL` Only used for generating SSL certificates\n   - `GKE_ZONE` Choose a region or zone from [this list](https://cloud.google.com/compute/docs/regions-zones) for your Kubernetes cluster\n   - `DOMAIN`\n2. Sign into your project `gcloud auth application-default login`\n3. Create the bucket for storing Terraform state (`make create-terraform-bucket`)\n4. Set `terraform.backend.bucket` in [infrastructure/main.tf](infrastructure/main.tf) to `TF_BUCKET`\n5. Insert secrets into Google Cloud [Secret Manager](https://console.cloud.google.com/security/secret-manager)\n   - GitHub OAuth (create [here](https://github.com/settings/developers))\n     - Set \"Authorization callback URL\" to `https://api.${DOMAIN}/github`\n     - `github_client_id`\n     - `github_client_secret`\n   - Secrets (generate [here](https://randomkeygen.com))\n     - `refresh_token_secret`\n     - `access_token_secret`\n   - MongoDB Atlas (create a free cluster [here](https://www.mongodb.com/cloud/atlas))\n     - Navigate to Project Settings -\u003e Access Manager -\u003e API Keys -\u003e Create API Key -\u003e Select Project Owner\n     - `mongodbatlas_public_key`\n     - `mongodbatlas_private_key`\n     - `atlas_project_id` (found under Settings)\n6. Add `0.0.0.0/0` to your MongoDB Atlas project \"IP Access List\" (Under Network Access)\n7. Enable [Container Registry](https://cloud.google.com/container-registry) in your GCP console\n8. `make init-infrastructure`\n9. `make deploy`\n10. Go to Google Cloud DNS, `main-zone`, copy the `NS` record to your domain registrar\n11. Uncomment code block in [infrastructure/modules/kubernetes-cert-manager/main.tf](infrastructure/modules/kubernetes-cert-manager/main.tf) and run `make apply`\n12. The app should be live at `https://${DOMAIN}`\n\n- Every time you want to deploy changes, just run `make deploy`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflolu%2Fauth","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflolu%2Fauth","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflolu%2Fauth/lists"}