{"id":23537492,"url":"https://github.com/smikodanic/angular-passport","last_synced_at":"2025-10-27T23:37:03.047Z","repository":{"id":57178888,"uuid":"68384903","full_name":"smikodanic/angular-passport","owner":"smikodanic","description":"Angular module for PassportJS login and API auth. Strategies: Basic, JWT, Hash","archived":false,"fork":false,"pushed_at":"2017-02-09T21:02:56.000Z","size":44,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-03T09:45:20.376Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/smikodanic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-16T14:05:46.000Z","updated_at":"2017-12-02T15:37:46.000Z","dependencies_parsed_at":"2022-09-09T17:30:34.990Z","dependency_job_id":null,"html_url":"https://github.com/smikodanic/angular-passport","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/smikodanic/angular-passport","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smikodanic%2Fangular-passport","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smikodanic%2Fangular-passport/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smikodanic%2Fangular-passport/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smikodanic%2Fangular-passport/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/smikodanic","download_url":"https://codeload.github.com/smikodanic/angular-passport/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smikodanic%2Fangular-passport/sbom","scorecard":{"id":833382,"data":{"date":"2025-08-11","repo":{"name":"github.com/smikodanic/angular-passport","commit":"d5b4c413c7a1e5f8a46f975760cfc5d94631ed82"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/27 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-23T18:20:18.537Z","repository_id":57178888,"created_at":"2025-08-23T18:20:18.537Z","updated_at":"2025-08-23T18:20:18.537Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281361402,"owners_count":26487881,"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","status":"online","status_checked_at":"2025-10-27T02:00:05.855Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2024-12-26T03:15:47.292Z","updated_at":"2025-10-27T23:37:03.019Z","avatar_url":"https://github.com/smikodanic.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# angular-passport\n\u003e Angular module for PassportJS login and API auth. Strategies: **Basic, JWT, Hash**\n\n## Installation\n`npm install angular-passport`\n\n## Prerequisites\nInclude these modules in your app because they are required for `angular-passport` to work properly:\n- ngCookies (\u003ca href=\"https://docs.angularjs.org/api/ngCookies\"\u003ehttps://docs.angularjs.org/api/ngCookies\u003c/a\u003e)\n- ui.router (\u003ca href=\"https://github.com/angular-ui/ui-router\"\u003ehttps://github.com/angular-ui/ui-router\u003c/a\u003e)\n\n\t```javascript\n\tvar clientApp = angular.module('clientApp', [\n\t    'ui.router',\n\t    'ngCookies',\n\t    'ngPassport.basicStrategy',\n\t    // 'ngPassport.JWTStrategy',\n\t    // 'ngPassport.hashStrategy'\n\t]);\n\t```\n\n\n## Usage\n### If you use Browserify\n\n```javascript\nvar ngPassportBasic = require('angular-passport').ngPassportBasic;\n\n/* configure */\nngPassportBasic.constant('NGPASSPORT_CONF_BASIC', {\n    // API_BASE_URL: 'http://192.168.1.101:9005',\n    API_BASE_URL: 'http://localhost:9005',\n    API_AUTH_PATHNAME: '/examples/auth/passport/basicstrategy',\n    URL_AFTER_SUCCESSFUL_LOGIN: '/examples-spa/login/basic/page1',\n    URL_AFTER_LOGOUT: '/examples-spa/login/basic/form'\n});\n```\n\n### If you include it into HTML file (compiled version)\n\n```javascript\n\u003cscript src=\"... /angular-passport/dist/js/ngPassport.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n    ngPassportHash.constant('NGPASSPORT_CONF_HASH', {\n        API_BASE_URL: 'http://localhost:9005',\n        API_AUTH_PATHNAME: '/examples/auth/passport/hashstrategy-gethash',\n        URL_AFTER_SUCCESSFUL_LOGIN: '/examples-spa/login/hash/page1',\n        URL_AFTER_LOGOUT: '/examples-spa/login/hash/form'\n    });\n\u003c/script\u003e\n```\n\n---\n\n## Directives\nThere are 2 directives in `angular-passport` to generate:\n\n- **Login Form**\n\n\t```html\n\t\u003cngpassport-form\u003e\u003c/ngpassport-form\u003e\n\t```\n\n\t```html\n\t\u003cngpassport-form templateurl=\"myBootstrapForm.html\"\u003e\u003c/ngpassport-form\u003e\n\n\t\u003c!-- override default form template --\u003e\n\t\u003cscript type=\"text/ng-template\" id=\"myBootstrapForm.html\"\u003e\n\n\t   \u003cdiv\u003e\n\t   \t\t\u003cform action=\"#\" method=\"POST\" enctype=\"application/x-www-form-urlencoded\" class=\"form-horizontal\"\u003e\n\n\t\t\t\t\u003cdiv class=\"form-group\"\u003e\n\t\t\t\t\t\u003clabel for=\"username\" class=\"col-sm-4 control-label\"\u003eusername:\u003c/label\u003e\n\t\t\t\t\t\u003cdiv class=\"col-sm-4\"\u003e\n\t\t\t\t\t\t\u003cinput type=\"text\" class=\"form-control\" ng-init=\"username='john'\" ng-model=\"username\"\u003e\n\t\t\t\t\t\u003c/div\u003e\n\t\t\t\t\u003c/div\u003e\n\n\t\t\t\t\u003cdiv class=\"form-group\"\u003e\n\t\t\t\t\t\u003clabel for=\"password\" class=\"col-sm-4 control-label\"\u003epassword:\u003c/label\u003e\n\t\t\t\t\t\u003cdiv class=\"col-sm-4\"\u003e\n\t\t\t\t\t\t\u003cinput type=\"text\" class=\"form-control\" ng-init=\"password='test'\" ng-model=\"password\"\u003e\n\t\t\t\t\t\u003c/div\u003e\n\t\t\t\t\t\u003cdiv class=\"col-sm-3\"\u003e\n\t\t\t\t\t\t\u003cinput type=\"button\" value=\"Login Basic\" class=\"btn btn-success\" ng-click=\"login()\"\u003e\n\t\t\t\t\t\u003c/div\u003e\n\t\t\t\t\u003c/div\u003e\n\n\t\t\t\u003c/form\u003e\n\n\t\t\t\u003cp class=\"alert alert-danger\" ng-if=\"errMsg\"\u003e{{errMsg}}\u003c/p\u003e\n\t\t\u003c/div\u003e\n\n\t\u003c/script\u003e\n\t```\n\n- **Logout Button**\n\t```html\n\t\u003cngpassport-logout\u003eLogout\u003c/ngpassport-logout\u003e\n\t```\n\n\t```html\n\t\u003cngpassport-logout template-url=\"myBootstrapLogout.html\"\u003eLogout\u003c/ngpassport-logout\u003e\n\n\t\u003c!-- override default form template --\u003e\n\t\u003cscript type=\"text/ng-template\" id=\"myBootstrapLogout.html\"\u003e\n\t   \t\u003ca href=\"#\" style=\"border:1px solid Gray;font-size:21px;padding:5px;\" ng-click=\"logout()\"\u003e\u003cspan class=\"glyphicon glyphicon-log-out\"\u003e\u003c/span\u003e\u003c/a\u003e\n\t\u003c/script\u003e\n\t```\n\n\n####Regular HTML\n*Notice that you can also use regular HTML tags instead of angular directives. For example:*\n```html\n\u003cbutton class=\"btn btn-success\" ng-controller=\"NgPassportBasicCtrl\" ng-click=\"logout()\"\u003eLogout\u003c/button\u003e\n```\n\nor\n\n```html\n\t\u003c!-- form created by standard HTML tags --\u003e\n\t\u003cform action=\"#\" method=\"POST\" enctype=\"application/x-www-form-urlencoded\" class=\"form-horizontal\" ng-controller=\"NgPassportBasicCtrl\"\u003e\n\n\t\t\u003cdiv class=\"form-group\"\u003e\n\t\t\t\u003clabel for=\"username\" class=\"col-sm-4 control-label\"\u003eusername:\u003c/label\u003e\n\t\t\t\u003cdiv class=\"col-sm-4\"\u003e\n\t\t\t\t\u003cinput type=\"text\" class=\"form-control\" ng-init=\"username='john'\" ng-model=\"username\"\u003e\n\t\t\t\u003c/div\u003e\n\t\t\u003c/div\u003e\n\n\t\t\u003cdiv class=\"form-group\"\u003e\n\t\t\t\u003clabel for=\"password\" class=\"col-sm-4 control-label\"\u003epassword:\u003c/label\u003e\n\t\t\t\u003cdiv class=\"col-sm-4\"\u003e\n\t\t\t\t\u003cinput type=\"text\" class=\"form-control\" ng-init=\"password='test'\" ng-model=\"password\"\u003e\n\t\t\t\u003c/div\u003e\n\t\t\t\u003cdiv class=\"col-sm-3\"\u003e\n\t\t\t\t\u003cinput type=\"button\" value=\"Login Basic\" class=\"btn btn-info\" ng-click=\"login()\"\u003e\n\t\t\t\u003c/div\u003e\n\t\t\u003c/div\u003e\n\n\t\t\u003cp class=\"alert alert-danger\" ng-if=\"errMsg\"\u003e{{errMsg}}\u003c/p\u003e\n\t\u003c/form\u003e\n```\n\n### Protect routes (states) and API endpoints\nAll API endpoints are protected by default with $http interceptor, so each $http request is added with 'Authorization' header.\n\nRoute protection is also very simple. Just add `authRequired: true` inside your state definition, and state will not be accessible if authentication failed.\n\n```javascript\n/* state: 'examples-spa_login_jwt_page1'\n * url: /examples-spa/login/jwt/page1\n ************************/\nmodule.exports = function (APPCONF) {\n    'use strict';\n\n    return {\n        url: '/examples-spa/login/jwt/page1',\n        views: {\n            '': {\n                templateUrl: APPCONF.PATH_DIST_HTML + '/examples-spa/login/jwt/page1/page1.html'\n            },\n            'topmenu@examples-spa_login_jwt_page1': {\n                templateUrl: APPCONF.PATH_DIST_HTML + '/examples-spa/login/jwt/_common/topmenu/topmenu.html',\n                controller: 'TopmenuJWTCtrl'\n            }\n        },\n\n        authRequired: true\n\n    };\n};\n```\n\n---\n---\n\n\n### Basic Authentication\n1. When user type username \u0026amp; password in login form a string 'username:password' is encoded to base64 (john:test  =\u003e  am9objp0ZXN0)\n2. A request with header: `Authorization: Basic am9objp0ZXN0` is sent to API.\n3. If auth was successful API returns object\n\n\t```json\n\t{\n\t \"isLoggedIn\": true,\n\t \"msg\": \"Basic authentication was succcessfull.\",\n\t   \"putLocally\": {\n\t   \t\t\"username\": \"john\",\n\t   \t\t\"authHeader\": \"Basic am9objp0ZXN0\"\n\t  \t}\n\t}\n\t```\n\n4. A cookie 'authAPI' is set with object `putLocally` .\n5. Angular sets up interceptor with cookie data and each $http request sent to API is intercepted with\n   *'Authorization':'Basic am9objp0ZXN0'* header\n\n\n\n###JWT Authentication\n1. User type username \u0026amp; password and when Login button is clicked request\n `POST /examples/auth/passport/jwtstrategy-gettoken {username: 'john', password: 'test'}` is sent to API\n2. Client receives respond object from API\n\n\t```javascript\n\t{\n\t  \"isLoggedIn\": true,\n\t  \"msg\": \"Login was successful. JWT Token is generated and you can use it in request header to access API. Authorization: JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU3YTcyNjk1MzcwYmM1MDk2MmUzNDVmZSIsImlhdCI6MTQ3Mzg2MDgyM30.R-OPMVRUXgZ2RK4iPkmEMWGbKg7iN_zJj1MA1cGBHWY\",\n\t  \"putLocally\": {\n\t    \"username\": \"john\",\n\t    \"authHeader\": \"JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU3YTcyNjk1MzcwYmM1MDk2MmUzNDVmZSIsImlhdCI6MTQ3Mzg2MDgyM30.R-OPMVRUXgZ2RK4iPkmEMWGbKg7iN_zJj1MA1cGBHWY\"\n\t  }\n\t}\n\t```\n\n3. Object `putLocally` is used to create cookie 'authAPI' .\n4. Angular sets up interceptor with cookie data and each $http request sent to API is intercepted with 'Authorization': 'JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU3YTcyNjk1MzcwYmM1MDk2MmUzNDVmZSIsImlhdCI6MTQ3Mzg2MDgyM30.R-OPMVRUXgZ2RK4iPkmEMWGbKg7iN_zJj1MA1cGBHWY'\n\n\n###Hash Authentication\n*Notice: Hash string must be stored in database and returned by API on user's successful login*\n\n1. User type username \u0026amp; password and when Login button is clicked request\n   `POST /examples/auth/passport/hashstrategy-gethash {username: 'john', password: 'test'}` is sent to API\n2. Client receives respond object from API\n\n\t```javascript\n\t{\n\t  \"isLoggedIn\": true,\n\t  \"msg\": \"Login was successful. Now you can use hash to access API endpoints. For example: /examples/auth/passport/hashstrategy/e7b1951a91718085f4382391c31ef175df72addddb\",\n\t  \"putLocally\": {\n\t    \"username\": \"john\",\n\t    \"hash\": \"e7b1951a91718085f4382391c31ef175df72addddb\"\n\t  }\n\t}\n\t```\n\n3. Object `putLocally` is used to create cookie 'authAPI' .\n4. Angular sets up interceptor with cookie data and each $http request sent to API is intercepted by adding suffix to URL\n   for example: *GET /examples/auth/passport/hashstrategy/e7b1951a91718085f4382391c31ef175df72addddb*\n\n\n\n\n## Preconditions\n1. Directive will send 'username' and 'password' object properties to API: **{username: 'john', password: 'test'}** .\n   It is also possible to define some other variable names for example 'user', 'pass' if your API requires so.\n2. API response object when username and password are correct must have this format:\n\n\t```json\n\t{\n\t\t\"isLoggedIn\": true,\n\t \t\"msg\": \"Basic authentication was succcessfull.\",\n\t \t\"putLocally\": {\n\t  \t\t\"username\": \"john\",\n\t  \t\t\"authHeader\": \"Basic am9objp0ZXN0\"\n\t\t}\n\t}\n\t```\n\n3. Cookie will be set with 'putLocally' object, so it must have 'username' property.\n4. Configuration constants\n  - NGPASSPORT_CONF_BASIC\n\t```javascript\n\tvar ngPassportBasic = require('angular-passport').ngPassportBasic;\n\n\t/* configure */\n\tngPassportBasic.constant('NGPASSPORT_CONF_BASIC', {\n\t    // API_BASE_URL: 'http://192.168.1.101:9005',\n\t    API_BASE_URL: 'http://localhost:9005',\n\t    API_AUTH_PATHNAME: '/examples/auth/passport/basicstrategy',\n\t    URL_AFTER_SUCCESSFUL_LOGIN: '/examples-spa/login/basic/page1',\n\t    URL_AFTER_LOGOUT: '/examples-spa/login/basic/form'\n\t});\n\n\tmodule.exports = ngPassportBasic;\n\t```\n\n  - NGPASSPORT_CONF_JWT\n\t```javascript\n\tvar ngPassportJWT = require('angular-passport').ngPassportJWT;\n\n\t/* configure */\n\tngPassportJWT.constant('NGPASSPORT_CONF_JWT', {\n\t    // API_BASE_URL: 'http://192.168.1.101:9005',\n\t    API_BASE_URL: 'http://localhost:9005',\n\t    API_AUTH_PATHNAME: '/examples/auth/passport/jwtstrategy-gettoken',\n\t    URL_AFTER_SUCCESSFUL_LOGIN: '/examples-spa/login/jwt/page1',\n\t    URL_AFTER_LOGOUT: '/examples-spa/login/jwt/form'\n\t});\n\n\tmodule.exports = ngPassportJWT;\n\t```\n\n  - NGPASSPORT_CONF_HASH\n  \t```javascript\n  \tvar ngPassportHash = require('angular-passport').ngPassportHash;\n\n\t/* configure */\n\tngPassportHash.constant('NGPASSPORT_CONF_HASH', {\n\t    API_BASE_URL: 'http://192.168.1.101:9005',\n\t    // API_BASE_URL: 'http://localhost:9005',\n\t    API_AUTH_PATHNAME: '/examples/auth/passport/hashstrategy-gethash',\n\t    URL_AFTER_SUCCESSFUL_LOGIN: '/examples-spa/login/hash/page1',\n\t    URL_AFTER_LOGOUT: '/examples-spa/login/hash/form'\n\t});\n\n\tmodule.exports = ngPassportHash;\n \t```\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmikodanic%2Fangular-passport","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmikodanic%2Fangular-passport","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmikodanic%2Fangular-passport/lists"}