From 5a3281247beb54b5cbffdcddd16d2633b454baaf Mon Sep 17 00:00:00 2001 From: Eugen Ciur <eugen@papermerge.com> Date: Thu, 21 Oct 2021 21:13:39 +0200 Subject: [PATCH] basic client side authentication --- app/authenticators/oauth2.js | 9 +++ app/controllers/login.js | 34 ++++++++++ app/router.js | 2 + app/routes/login.js | 10 +++ app/routes/roles/index.js | 5 ++ app/templates/login.hbs | 10 +++ package-lock.json | 126 +++++++++++++++++++++++++++++++++++ package.json | 1 + 8 files changed, 197 insertions(+) create mode 100644 app/authenticators/oauth2.js create mode 100644 app/controllers/login.js create mode 100644 app/routes/login.js create mode 100644 app/templates/login.hbs diff --git a/app/authenticators/oauth2.js b/app/authenticators/oauth2.js new file mode 100644 index 0000000..267cf12 --- /dev/null +++ b/app/authenticators/oauth2.js @@ -0,0 +1,9 @@ +import OAuth2PasswordGrantAuthenticator from 'ember-simple-auth/authenticators/oauth2-password-grant'; + + +class OAuth2Authenticator extends OAuth2PasswordGrantAuthenticator { + serverTokenEndpoint = '/api/authenticate'; +} + + +export default OAuth2Authenticator; \ No newline at end of file diff --git a/app/controllers/login.js b/app/controllers/login.js new file mode 100644 index 0000000..8a51a71 --- /dev/null +++ b/app/controllers/login.js @@ -0,0 +1,34 @@ +import Controller from '@ember/controller'; +import { inject as service } from '@ember/service'; +import { action } from "@ember/object"; +import { tracked } from "@glimmer/tracking"; + + +export default class LoginController extends Controller { + @tracked errorMessage; + @service session; + + @action + async authenticate(event) { + event.preventDefault(); + + let { identification, password } = this; + + + await this.session.authenticate('authenticator:oauth2', identification, password); + + if (this.session.isAuthenticated) { + // What to do with all this success? + } + } + + @action + updateIdentification(event) { + this.identification = event.target.value; + } + + @action + updatePassword(event) { + this.password = event.target.value; + } +} \ No newline at end of file diff --git a/app/router.js b/app/router.js index 8484125..1dcf684 100644 --- a/app/router.js +++ b/app/router.js @@ -7,6 +7,8 @@ export default class Router extends EmberRouter { } Router.map(function () { + this.route('login'); + this.route('documents'); this.route('inbox'); this.route('document', { path: '/document/:document_id' }); diff --git a/app/routes/login.js b/app/routes/login.js new file mode 100644 index 0000000..c9cfd7d --- /dev/null +++ b/app/routes/login.js @@ -0,0 +1,10 @@ +import Route from '@ember/routing/route'; +import { inject as service } from '@ember/service'; + +export default class LoginRoute extends Route { + @service session; + + beforeModel(transition) { + this.get('session').prohibitAuthentication('index'); + } +} \ No newline at end of file diff --git a/app/routes/roles/index.js b/app/routes/roles/index.js index 757a7d6..7cd3825 100644 --- a/app/routes/roles/index.js +++ b/app/routes/roles/index.js @@ -3,6 +3,11 @@ import { inject as service } from '@ember/service'; class RolesRoute extends Route { @service store; + @service session; + + beforeModel(transition) { + this.session.requireAuthentication(transition, 'login'); + } async model() { return this.store.findAll('role'); diff --git a/app/templates/login.hbs b/app/templates/login.hbs new file mode 100644 index 0000000..5f0944e --- /dev/null +++ b/app/templates/login.hbs @@ -0,0 +1,10 @@ +<form {{on "submit" this.authenticate}}> + <label for="identification">Login</label> + <input id='identification' placeholder="Enter Login" value={{this.identification}} {{on "change" this.updateIdentification}}> + <label for="password">Password</label> + <input id='password' placeholder="Enter Password" value={{this.password}} {{on "change" this.updatePassword}}> + <button type="submit">Login</button> + {{#if this.errorMessage}} + <p>{{this.errorMessage}}</p> + {{/if}} +</form> \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index df8af8c..beba490 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4877,6 +4877,12 @@ } } }, + "base-64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", + "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=", + "dev": true + }, "base64-arraybuffer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", @@ -9738,6 +9744,16 @@ } } }, + "ember-cookies": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/ember-cookies/-/ember-cookies-0.5.2.tgz", + "integrity": "sha512-nZ7oG97kBcO9UHjO95ryABpnVx62Bhxo7lIsBJNmWvFXleILm9DGueiAynzXxuYWWPuKIeeSbYakrS1869tNTw==", + "dev": true, + "requires": { + "ember-cli-babel": "^7.1.0", + "ember-getowner-polyfill": "^1.1.0 || ^2.0.0" + } + }, "ember-data": { "version": "3.28.3", "resolved": "https://registry.npmjs.org/ember-data/-/ember-data-3.28.3.tgz", @@ -9925,6 +9941,33 @@ "integrity": "sha512-B7wiurPgsxsSGzJuPFkpBWnaeuCu2PGpG2BjyrfA1VcL7//o+5RSnZqiCEY326y7qmxb2GoCgo0ft03KBU0rRw==", "dev": true }, + "ember-factory-for-polyfill": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-factory-for-polyfill/-/ember-factory-for-polyfill-1.3.1.tgz", + "integrity": "sha512-y3iG2iCzH96lZMTWQw6LWNLAfOmDC4pXKbZP6FxG8lt7GGaNFkZjwsf+Z5GAe7kxfD7UG4lVkF7x37K82rySGA==", + "dev": true, + "requires": { + "ember-cli-version-checker": "^2.1.0" + }, + "dependencies": { + "ember-cli-version-checker": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz", + "integrity": "sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==", + "dev": true, + "requires": { + "resolve": "^1.3.3", + "semver": "^5.3.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "ember-fetch": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/ember-fetch/-/ember-fetch-8.1.1.tgz", @@ -10200,6 +10243,34 @@ } } }, + "ember-getowner-polyfill": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz", + "integrity": "sha512-rwGMJgbGzxIAiWYjdpAh04Abvt0s3HuS/VjHzUFhVyVg2pzAuz45B9AzOxYXzkp88vFC7FPaiA4kE8NxNk4A4Q==", + "dev": true, + "requires": { + "ember-cli-version-checker": "^2.1.0", + "ember-factory-for-polyfill": "^1.3.1" + }, + "dependencies": { + "ember-cli-version-checker": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz", + "integrity": "sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==", + "dev": true, + "requires": { + "resolve": "^1.3.3", + "semver": "^5.3.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "ember-inflector": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/ember-inflector/-/ember-inflector-4.0.2.tgz", @@ -10740,6 +10811,61 @@ "recast": "^0.18.1" } }, + "ember-simple-auth": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ember-simple-auth/-/ember-simple-auth-4.0.2.tgz", + "integrity": "sha512-6DoNfesB54ToDMv89r7KFtIR1EFYWurAAlD5KRnnerhBbRH0ws3EK2g7O/8wVJoBuPOuvHZlEnJVCtzp+oauyg==", + "dev": true, + "requires": { + "base-64": "^0.1.0", + "broccoli-funnel": "^1.2.0 || ^2.0.0", + "ember-cli-babel": "^7.20.5", + "ember-cli-is-package-missing": "^1.0.0", + "ember-cookies": "^0.5.0", + "silent-error": "^1.0.0" + }, + "dependencies": { + "broccoli-funnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz", + "integrity": "sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "ember-source": { "version": "3.28.1", "resolved": "https://registry.npmjs.org/ember-source/-/ember-source-3.28.1.tgz", diff --git a/package.json b/package.json index 324c13e..5abf140 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "ember-page-title": "^6.2.2", "ember-qunit": "^5.1.4", "ember-resolver": "^8.0.2", + "ember-simple-auth": "^4.0.2", "ember-source": "~3.28.0", "ember-template-lint": "^3.6.0", "eslint": "^7.32.0", -- GitLab