{"id":23379547,"url":"https://github.com/johnnygerard/mean-authentication","last_synced_at":"2025-12-30T21:18:45.371Z","repository":{"id":251540377,"uuid":"837710064","full_name":"johnnygerard/mean-authentication","owner":"johnnygerard","description":"Authentication for the MEAN stack","archived":false,"fork":false,"pushed_at":"2024-11-29T01:16:45.000Z","size":1881,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-21T19:19:17.494Z","etag":null,"topics":["angular","angular-material","authentication","express","mean-stack","mongodb-atlas","node","redis"],"latest_commit_sha":null,"homepage":"https://mean-authentication.app.jgerard.dev/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/johnnygerard.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-03T19:33:26.000Z","updated_at":"2024-11-29T01:16:48.000Z","dependencies_parsed_at":"2024-10-25T02:42:33.615Z","dependency_job_id":"a59734c1-f8b2-49ec-9168-3ab38c2dc693","html_url":"https://github.com/johnnygerard/mean-authentication","commit_stats":null,"previous_names":["johnnygerard/mean-authentication"],"tags_count":31,"template":false,"template_full_name":"johnnygerard/mean-app-starter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnnygerard%2Fmean-authentication","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnnygerard%2Fmean-authentication/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnnygerard%2Fmean-authentication/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johnnygerard%2Fmean-authentication/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/johnnygerard","download_url":"https://codeload.github.com/johnnygerard/mean-authentication/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238778476,"owners_count":19528913,"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":["angular","angular-material","authentication","express","mean-stack","mongodb-atlas","node","redis"],"created_at":"2024-12-21T19:19:23.893Z","updated_at":"2025-10-29T06:30:23.753Z","avatar_url":"https://github.com/johnnygerard.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AuthMEAN\n\n![project status](https://img.shields.io/badge/project_status-inactive-lightgray?style=for-the-badge)\n\nThis project provides a reusable authentication system for applications built on\nthe [MEAN stack](https://www.mongodb.com/resources/languages/mean-stack).\n\n[![live demo](https://img.shields.io/badge/live_demo-blue?style=for-the-badge)](https://mean-authentication.app.jgerard.dev/)\n\nWarning: Because the API server sleeps after 30 minutes of inactivity\n(see [Dyno Sleeping](https://devcenter.heroku.com/articles/eco-dyno-hours#dyno-sleeping)),\nyou may experience a few seconds of delay on the first API request.\n\n## Tech Stack \u0026 Architecture\n\n[TypeScript](https://www.typescriptlang.org/) is used across the full stack.\n\n### Frontend\n\n- **Framework**: [Angular](https://angular.dev/)\n- **UI Library**: [Angular Material](https://material.angular.io/)\n- **Style**: [Sass](https://sass-lang.com/)\n\n### Backend\n\n- **CDN**: Static assets delivered through [Vercel Edge Network](https://vercel.com/docs/edge-network/overview).\n- **API Server**: Powered by [Express](https://expressjs.com/) and hosted on [Heroku](https://www.heroku.com/).\n- **Database**: User data stored in [MongoDB Atlas](https://www.mongodb.com/atlas).\n- **Cache**: Session data managed by [Redis Cloud](https://redis.io/cloud/).\n\n## Features\n\n### High-Level\n\n- User login/registration with username and password\n- Logout and session revocation\n- Password update\n- Account deletion with password confirmation\n\n### Password\n\n- Strength validation with [zxcvbn](https://github.com/dropbox/zxcvbn?tab=readme-ov-file#readme)\n- [Argon2](https://github.com/P-H-C/phc-winner-argon2?tab=readme-ov-file#readme) hashing algorithm\n- [Pwned Passwords API](https://haveibeenpwned.com/API/v3#PwnedPasswords) validation\n\n### Security\n\n- Session authentication with encrypted cookies\n- Session data stored in Redis Cloud\n- CSRF protection using\n  the [synchronizer token pattern](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#synchronizer-token-pattern)\n- Rate limiting with [express-rate-limit](https://express-rate-limit.mintlify.app/overview)\n\n### Performance\n\n- [Prerendering (SSG)](https://angular.dev/guide/prerendering)\n- Lazy-loaded components\n- `OnPush` change detection strategy\n- Worker threads for CPU-intensive tasks\n\n### Testing\n\n- Server-side testing with [Node.js test runner](https://nodejs.org/api/test.html#test-runner)\n- [Playwright](https://playwright.dev/) end-to-end testing\n- Test data generated by [Faker](https://fakerjs.dev/)\n\n## Version Requirements\n\n- Angular 18\n- Node.js 22\n- Express 4\n- MongoDB Atlas 7\n- Redis Stack 7.4\n\n## Lighthouse Reports\n\nVersion audited: v0.19.0\n\n- [Home page](https://googlechrome.github.io/lighthouse/viewer/?gist=c57216d3b70a42c74d21b6bccc66a57b)\n- [Registration page](https://googlechrome.github.io/lighthouse/viewer/?gist=a8c3b920ce36abfc5973bd60459409cc)\n- [Login page](https://googlechrome.github.io/lighthouse/viewer/?gist=5cff44991036ae26c29fd741bc6ec5e2)\n\n## Dev Environment \u0026 Tools\n\n- System: [Ubuntu](https://ubuntu.com/desktop)\n- IDE: [WebStorm](https://www.jetbrains.com/webstorm/)\n- Formatter: [Prettier](https://prettier.io/)\n- Linter: [ESLint](https://eslint.org/)\n- AI assistant: [GitHub Copilot](https://github.com/features/copilot)\n\n## Screenshots\n\n### Registration Page\n\n![registration page](docs/screenshots/registration-page.avif)\n\n### Login Page\n\n![login page](docs/screenshots/login-page.avif)\n\n## Credits\n\n- Password strength meter design derived\n  from [Memorisely : Password Challenge](https://www.figma.com/community/file/1332443075558142445/memorisely-password-challenge)\n  by [Adil D](https://www.figma.com/@adildahmani)\n\n## Copyright\n\n© 2024 Johnny Gérard\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohnnygerard%2Fmean-authentication","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjohnnygerard%2Fmean-authentication","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohnnygerard%2Fmean-authentication/lists"}