├── .gitignore
├── README.md
├── angular
├── .angular-cli.json
├── .editorconfig
├── README.md
├── e2e
│ ├── app.e2e-spec.ts
│ ├── app.po.ts
│ └── tsconfig.e2e.json
├── karma.conf.js
├── package-lock.json
├── package.json
├── protractor.conf.js
├── src
│ ├── app
│ │ ├── app-routing.module.ts
│ │ ├── app.component.css
│ │ ├── app.component.html
│ │ ├── app.component.spec.ts
│ │ ├── app.component.ts
│ │ ├── app.module.ts
│ │ ├── login
│ │ │ ├── login.component.css
│ │ │ ├── login.component.html
│ │ │ ├── login.component.spec.ts
│ │ │ └── login.component.ts
│ │ ├── main-desk
│ │ │ ├── main-desk.component.css
│ │ │ ├── main-desk.component.html
│ │ │ ├── main-desk.component.spec.ts
│ │ │ └── main-desk.component.ts
│ │ ├── myservice.service.spec.ts
│ │ ├── myservice.service.ts
│ │ ├── register
│ │ │ ├── register.component.css
│ │ │ ├── register.component.html
│ │ │ ├── register.component.spec.ts
│ │ │ └── register.component.ts
│ │ └── user-dashboard
│ │ │ ├── user-dashboard.component.css
│ │ │ ├── user-dashboard.component.html
│ │ │ ├── user-dashboard.component.spec.ts
│ │ │ └── user-dashboard.component.ts
│ ├── assets
│ │ ├── .gitkeep
│ │ └── images
│ │ │ └── back1.jpg
│ ├── environments
│ │ ├── environment.prod.ts
│ │ └── environment.ts
│ ├── favicon.ico
│ ├── index.html
│ ├── main.ts
│ ├── polyfills.ts
│ ├── styles.css
│ ├── test.ts
│ ├── tsconfig.app.json
│ ├── tsconfig.spec.json
│ └── typings.d.ts
├── tsconfig.json
└── tslint.json
└── backend
├── app.js
├── bin
└── www
├── models
└── user.js
├── package-lock.json
├── package.json
├── public
└── stylesheets
│ └── style.css
├── routes
├── index.js
└── users.js
└── views
├── error.ejs
└── index.ejs
/.gitignore:
--------------------------------------------------------------------------------
1 | backend/node_modules
2 | angular/node_modules
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # token-based-authentication
2 | Youtube tutorial on Node.JS token based authentication with JWT and Angular
3 |
4 | Tutorial Available at : https://youtu.be/toRmWFzB6-E
5 |
--------------------------------------------------------------------------------
/angular/.angular-cli.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3 | "project": {
4 | "name": "angular"
5 | },
6 | "apps": [
7 | {
8 | "root": "src",
9 | "outDir": "dist",
10 | "assets": [
11 | "assets",
12 | "favicon.ico"
13 | ],
14 | "index": "index.html",
15 | "main": "main.ts",
16 | "polyfills": "polyfills.ts",
17 | "test": "test.ts",
18 | "tsconfig": "tsconfig.app.json",
19 | "testTsconfig": "tsconfig.spec.json",
20 | "prefix": "app",
21 | "styles": [
22 | "styles.css"
23 | ],
24 | "scripts": [],
25 | "environmentSource": "environments/environment.ts",
26 | "environments": {
27 | "dev": "environments/environment.ts",
28 | "prod": "environments/environment.prod.ts"
29 | }
30 | }
31 | ],
32 | "e2e": {
33 | "protractor": {
34 | "config": "./protractor.conf.js"
35 | }
36 | },
37 | "lint": [
38 | {
39 | "project": "src/tsconfig.app.json",
40 | "exclude": "**/node_modules/**"
41 | },
42 | {
43 | "project": "src/tsconfig.spec.json",
44 | "exclude": "**/node_modules/**"
45 | },
46 | {
47 | "project": "e2e/tsconfig.e2e.json",
48 | "exclude": "**/node_modules/**"
49 | }
50 | ],
51 | "test": {
52 | "karma": {
53 | "config": "./karma.conf.js"
54 | }
55 | },
56 | "defaults": {
57 | "styleExt": "css",
58 | "component": {}
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/angular/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | max_line_length = off
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/angular/README.md:
--------------------------------------------------------------------------------
1 | # Angular
2 |
3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
4 |
5 | ## Development server
6 |
7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
8 |
9 | ## Code scaffolding
10 |
11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
12 |
13 | ## Build
14 |
15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
16 |
17 | ## Running unit tests
18 |
19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
20 |
21 | ## Running end-to-end tests
22 |
23 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
24 |
25 | ## Further help
26 |
27 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
28 |
--------------------------------------------------------------------------------
/angular/e2e/app.e2e-spec.ts:
--------------------------------------------------------------------------------
1 | import { AppPage } from './app.po';
2 |
3 | describe('angular App', () => {
4 | let page: AppPage;
5 |
6 | beforeEach(() => {
7 | page = new AppPage();
8 | });
9 |
10 | it('should display welcome message', () => {
11 | page.navigateTo();
12 | expect(page.getParagraphText()).toEqual('Welcome to app!');
13 | });
14 | });
15 |
--------------------------------------------------------------------------------
/angular/e2e/app.po.ts:
--------------------------------------------------------------------------------
1 | import { browser, by, element } from 'protractor';
2 |
3 | export class AppPage {
4 | navigateTo() {
5 | return browser.get('/');
6 | }
7 |
8 | getParagraphText() {
9 | return element(by.css('app-root h1')).getText();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/angular/e2e/tsconfig.e2e.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/e2e",
5 | "baseUrl": "./",
6 | "module": "commonjs",
7 | "target": "es5",
8 | "types": [
9 | "jasmine",
10 | "jasminewd2",
11 | "node"
12 | ]
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/angular/karma.conf.js:
--------------------------------------------------------------------------------
1 | // Karma configuration file, see link for more information
2 | // https://karma-runner.github.io/1.0/config/configuration-file.html
3 |
4 | module.exports = function (config) {
5 | config.set({
6 | basePath: '',
7 | frameworks: ['jasmine', '@angular/cli'],
8 | plugins: [
9 | require('karma-jasmine'),
10 | require('karma-chrome-launcher'),
11 | require('karma-jasmine-html-reporter'),
12 | require('karma-coverage-istanbul-reporter'),
13 | require('@angular/cli/plugins/karma')
14 | ],
15 | client:{
16 | clearContext: false // leave Jasmine Spec Runner output visible in browser
17 | },
18 | coverageIstanbulReporter: {
19 | reports: [ 'html', 'lcovonly' ],
20 | fixWebpackSourcePaths: true
21 | },
22 | angularCli: {
23 | environment: 'dev'
24 | },
25 | reporters: ['progress', 'kjhtml'],
26 | port: 9876,
27 | colors: true,
28 | logLevel: config.LOG_INFO,
29 | autoWatch: true,
30 | browsers: ['Chrome'],
31 | singleRun: false
32 | });
33 | };
34 |
--------------------------------------------------------------------------------
/angular/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular",
3 | "version": "0.0.0",
4 | "license": "MIT",
5 | "scripts": {
6 | "ng": "ng",
7 | "start": "ng serve",
8 | "build": "ng build --prod",
9 | "test": "ng test",
10 | "lint": "ng lint",
11 | "e2e": "ng e2e"
12 | },
13 | "private": true,
14 | "dependencies": {
15 | "@angular/animations": "^5.2.0",
16 | "@angular/cdk": "^5.2.5",
17 | "@angular/common": "^5.2.0",
18 | "@angular/compiler": "^5.2.0",
19 | "@angular/core": "^5.2.0",
20 | "@angular/forms": "^5.2.0",
21 | "@angular/http": "^5.2.0",
22 | "@angular/material": "^5.2.5",
23 | "@angular/platform-browser": "^5.2.0",
24 | "@angular/platform-browser-dynamic": "^5.2.0",
25 | "@angular/router": "^5.2.0",
26 | "core-js": "^2.4.1",
27 | "rxjs": "^5.5.6",
28 | "zone.js": "^0.8.19"
29 | },
30 | "devDependencies": {
31 | "@angular/cli": "~1.7.4",
32 | "@angular/compiler-cli": "^5.2.0",
33 | "@angular/language-service": "^5.2.0",
34 | "@types/jasmine": "~2.8.3",
35 | "@types/jasminewd2": "~2.0.2",
36 | "@types/node": "~6.0.60",
37 | "codelyzer": "^4.0.1",
38 | "jasmine-core": "~2.8.0",
39 | "jasmine-spec-reporter": "~4.2.1",
40 | "karma": "~2.0.0",
41 | "karma-chrome-launcher": "~2.2.0",
42 | "karma-coverage-istanbul-reporter": "^1.2.1",
43 | "karma-jasmine": "~1.1.0",
44 | "karma-jasmine-html-reporter": "^0.2.2",
45 | "protractor": "~5.1.2",
46 | "ts-node": "~4.1.0",
47 | "tslint": "~5.9.1",
48 | "typescript": "~2.5.3"
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/angular/protractor.conf.js:
--------------------------------------------------------------------------------
1 | // Protractor configuration file, see link for more information
2 | // https://github.com/angular/protractor/blob/master/lib/config.ts
3 |
4 | const { SpecReporter } = require('jasmine-spec-reporter');
5 |
6 | exports.config = {
7 | allScriptsTimeout: 11000,
8 | specs: [
9 | './e2e/**/*.e2e-spec.ts'
10 | ],
11 | capabilities: {
12 | 'browserName': 'chrome'
13 | },
14 | directConnect: true,
15 | baseUrl: 'http://localhost:4200/',
16 | framework: 'jasmine',
17 | jasmineNodeOpts: {
18 | showColors: true,
19 | defaultTimeoutInterval: 30000,
20 | print: function() {}
21 | },
22 | onPrepare() {
23 | require('ts-node').register({
24 | project: 'e2e/tsconfig.e2e.json'
25 | });
26 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/angular/src/app/app-routing.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { CommonModule } from '@angular/common';
3 | import { RouterModule, Routes } from '@angular/router';
4 | import { LoginComponent } from './login/login.component';
5 | import { MainDeskComponent } from './main-desk/main-desk.component';
6 | import { RegisterComponent } from './register/register.component';
7 | import { UserDashboardComponent } from './user-dashboard/user-dashboard.component';
8 |
9 | const routes: Routes = [
10 | { path: '', redirectTo: 'main', pathMatch: 'full' },
11 | {
12 | path: 'main', component: MainDeskComponent, children:
13 | [
14 | {path: '', redirectTo: 'login', pathMatch: 'full'},
15 | { path: 'login', component: LoginComponent },
16 | { path: 'register', component: RegisterComponent }
17 | ]
18 | },
19 | {path: 'dash' , component: UserDashboardComponent}
20 | ];
21 |
22 | @NgModule({
23 | imports: [
24 | CommonModule,
25 | RouterModule.forRoot(routes)
26 | ],
27 | exports: [RouterModule],
28 | declarations: []
29 | })
30 | export class AppRoutingModule { }
31 |
--------------------------------------------------------------------------------
/angular/src/app/app.component.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AzharHusain/token-based-authentication/315651cebfcc4be2ef57394fe48f6a69aa6da41a/angular/src/app/app.component.css
--------------------------------------------------------------------------------
/angular/src/app/app.component.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/angular/src/app/app.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { TestBed, async } from '@angular/core/testing';
2 | import { AppComponent } from './app.component';
3 | describe('AppComponent', () => {
4 | beforeEach(async(() => {
5 | TestBed.configureTestingModule({
6 | declarations: [
7 | AppComponent
8 | ],
9 | }).compileComponents();
10 | }));
11 | it('should create the app', async(() => {
12 | const fixture = TestBed.createComponent(AppComponent);
13 | const app = fixture.debugElement.componentInstance;
14 | expect(app).toBeTruthy();
15 | }));
16 | it(`should have as title 'app'`, async(() => {
17 | const fixture = TestBed.createComponent(AppComponent);
18 | const app = fixture.debugElement.componentInstance;
19 | expect(app.title).toEqual('app');
20 | }));
21 | it('should render title in a h1 tag', async(() => {
22 | const fixture = TestBed.createComponent(AppComponent);
23 | fixture.detectChanges();
24 | const compiled = fixture.debugElement.nativeElement;
25 | expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!');
26 | }));
27 | });
28 |
--------------------------------------------------------------------------------
/angular/src/app/app.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-root',
5 | templateUrl: './app.component.html',
6 | styleUrls: ['./app.component.css']
7 | })
8 | export class AppComponent {
9 | title = 'app';
10 | }
11 |
--------------------------------------------------------------------------------
/angular/src/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import { BrowserModule } from '@angular/platform-browser';
2 | import { NgModule } from '@angular/core';
3 | import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
4 | import { AppComponent } from './app.component';
5 | import { LoginComponent } from './login/login.component';
6 | import { RegisterComponent } from './register/register.component';
7 | import { UserDashboardComponent } from './user-dashboard/user-dashboard.component';
8 | import { AppRoutingModule } from './/app-routing.module';
9 | import { MainDeskComponent } from './main-desk/main-desk.component';
10 |
11 | import {MatInputModule} from '@angular/material/input';
12 | import {MatSnackBarModule} from '@angular/material/snack-bar';
13 | import { MatButtonModule } from '@angular/material';
14 |
15 | import { FormsModule, ReactiveFormsModule } from '@angular/forms';
16 | import {MyserviceService} from './myservice.service';
17 | import { HttpClientModule } from '@angular/common/http';
18 |
19 |
20 | @NgModule({
21 | declarations: [
22 | AppComponent,
23 | LoginComponent,
24 | RegisterComponent,
25 | UserDashboardComponent,
26 | MainDeskComponent
27 | ],
28 | imports: [
29 | BrowserModule,
30 | BrowserAnimationsModule,
31 | AppRoutingModule,
32 | MatInputModule,
33 | MatSnackBarModule,
34 | MatButtonModule,
35 | FormsModule,
36 | ReactiveFormsModule,
37 | HttpClientModule
38 | ],
39 | providers: [ MyserviceService],
40 | bootstrap: [AppComponent]
41 | })
42 | export class AppModule { }
43 |
--------------------------------------------------------------------------------
/angular/src/app/login/login.component.css:
--------------------------------------------------------------------------------
1 | .formcontainer{
2 | display: flex;
3 | flex-direction: column;
4 | justify-content: center;
5 | align-items: center;
6 | }
7 |
8 | .formbody{
9 | display: flex;
10 | width: 290px;
11 | min-height: 200px;
12 | background-color: white;
13 | box-shadow:0 5px 10px 0px rgba(0, 0, 0, 0.1);
14 | border-radius: 10px;
15 | padding: 25px;
16 | }
17 |
18 | div > span {
19 | font-size: 0.75rem;
20 | color: firebrick;
21 | }
22 |
23 |
24 |
25 |
26 | .header{
27 | font-size: 2rem;
28 | text-align: center;
29 | margin-bottom: 40px;
30 | }
--------------------------------------------------------------------------------
/angular/src/app/login/login.component.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/angular/src/app/login/login.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { LoginComponent } from './login.component';
4 |
5 | describe('LoginComponent', () => {
6 | let component: LoginComponent;
7 | let fixture: ComponentFixture;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ LoginComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(LoginComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/angular/src/app/login/login.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { AbstractControl, FormGroup, FormControl, Validators } from '@angular/forms';
3 | import { MyserviceService } from '../myservice.service';
4 | import { Router, ActivatedRoute } from '@angular/router';
5 |
6 | @Component({
7 | selector: 'app-login',
8 | templateUrl: './login.component.html',
9 | styleUrls: ['./login.component.css']
10 | })
11 | export class LoginComponent implements OnInit {
12 |
13 | loginForm: FormGroup;
14 | constructor(private _myservice: MyserviceService,
15 | private _router: Router,
16 | private _activatedRoute: ActivatedRoute) {
17 | this.loginForm = new FormGroup({
18 | email: new FormControl(null, Validators.required),
19 | password: new FormControl(null, Validators.required)
20 | });
21 |
22 | }
23 |
24 | ngOnInit() {
25 | }
26 |
27 | isValid(controlName) {
28 | return this.loginForm.get(controlName).invalid && this.loginForm.get(controlName).touched;
29 | }
30 |
31 | login() {
32 | console.log(this.loginForm.value);
33 |
34 | if (this.loginForm.valid) {
35 | this._myservice.login(this.loginForm.value)
36 | .subscribe(
37 | data => {
38 | console.log(data);
39 | localStorage.setItem('token', data.toString());
40 | this._router.navigate(['/dash']);
41 | },
42 | error => { }
43 | );
44 | }
45 | }
46 |
47 | movetoregister() {
48 | this._router.navigate(['../register'], { relativeTo: this._activatedRoute });
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/angular/src/app/main-desk/main-desk.component.css:
--------------------------------------------------------------------------------
1 | .container{
2 | width: 100vw;
3 | min-height: 100vh;
4 | background-image: url('../../assets/images/back1.jpg');
5 | background-size: cover;
6 | }
7 |
8 | .header{
9 | display: flex;
10 | }
11 | .headerLogo{
12 | font-family: 'Lobster', cursive;
13 | font-size: 4rem;
14 | margin-left: 20px;
15 | color: white;
16 | text-shadow: 2px 2px rgba(0, 0, 0, 0.5);
17 | }
18 |
--------------------------------------------------------------------------------
/angular/src/app/main-desk/main-desk.component.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/angular/src/app/main-desk/main-desk.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { MainDeskComponent } from './main-desk.component';
4 |
5 | describe('MainDeskComponent', () => {
6 | let component: MainDeskComponent;
7 | let fixture: ComponentFixture;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ MainDeskComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(MainDeskComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/angular/src/app/main-desk/main-desk.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'app-main-desk',
5 | templateUrl: './main-desk.component.html',
6 | styleUrls: ['./main-desk.component.css']
7 | })
8 | export class MainDeskComponent implements OnInit {
9 |
10 | constructor() { }
11 |
12 | ngOnInit() {
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/angular/src/app/myservice.service.spec.ts:
--------------------------------------------------------------------------------
1 | import { TestBed, inject } from '@angular/core/testing';
2 |
3 | import { MyserviceService } from './myservice.service';
4 |
5 | describe('MyserviceService', () => {
6 | beforeEach(() => {
7 | TestBed.configureTestingModule({
8 | providers: [MyserviceService]
9 | });
10 | });
11 |
12 | it('should be created', inject([MyserviceService], (service: MyserviceService) => {
13 | expect(service).toBeTruthy();
14 | }));
15 | });
16 |
--------------------------------------------------------------------------------
/angular/src/app/myservice.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient, HttpParams } from '@angular/common/http';
3 |
4 | @Injectable()
5 | export class MyserviceService {
6 |
7 | constructor(private _http: HttpClient) { }
8 |
9 | submitRegister(body:any){
10 | return this._http.post('http://localhost:3000/users/register', body,{
11 | observe:'body'
12 | });
13 | }
14 |
15 | login(body:any){
16 | return this._http.post('http://localhost:3000/users/login', body,{
17 | observe:'body'
18 | });
19 | }
20 |
21 | getUserName() {
22 | return this._http.get('http://localhost:3000/users/username', {
23 | observe: 'body',
24 | params: new HttpParams().append('token', localStorage.getItem('token'))
25 | });
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/angular/src/app/register/register.component.css:
--------------------------------------------------------------------------------
1 | .formcontainer{
2 | display: flex;
3 | flex-direction: column;
4 | justify-content: center;
5 | align-items: center;
6 | }
7 |
8 | .formbody{
9 | display: flex;
10 | width: 290px;
11 | min-height: 200px;
12 | background-color: white;
13 | box-shadow:0 5px 10px 0px rgba(0, 0, 0, 0.1);
14 | border-radius: 10px;
15 | padding: 25px;
16 | }
17 |
18 |
19 | .header{
20 | font-size: 2rem;
21 | text-align: center;
22 | margin-bottom: 20px;
23 | }
24 |
25 | div > span {
26 | font-size: 0.75rem;
27 | color: firebrick;
28 | }
--------------------------------------------------------------------------------
/angular/src/app/register/register.component.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/angular/src/app/register/register.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { RegisterComponent } from './register.component';
4 |
5 | describe('RegisterComponent', () => {
6 | let component: RegisterComponent;
7 | let fixture: ComponentFixture;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ RegisterComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(RegisterComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/angular/src/app/register/register.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { AbstractControl, FormGroup, FormControl, Validators } from '@angular/forms';
3 | import { MyserviceService } from '../myservice.service';
4 | import { ActivatedRoute, Router } from '@angular/router';
5 |
6 | @Component({
7 | selector: 'app-register',
8 | templateUrl: './register.component.html',
9 | styleUrls: ['./register.component.css']
10 | })
11 | export class RegisterComponent implements OnInit {
12 |
13 | myForm: FormGroup;
14 | successMessage: String = '';
15 | constructor(private _myservice: MyserviceService,
16 | private _router: Router,
17 | private _activatedRoute: ActivatedRoute) {
18 | this.myForm = new FormGroup({
19 | email: new FormControl(null, Validators.email),
20 | username: new FormControl(null, Validators.required),
21 | password: new FormControl(null, Validators.required),
22 | cnfpass: new FormControl(null, this.passValidator)
23 | });
24 |
25 | this.myForm.controls.password.valueChanges
26 | .subscribe(
27 | x => this.myForm.controls.cnfpass.updateValueAndValidity()
28 | );
29 | }
30 |
31 | ngOnInit() {
32 | }
33 |
34 | isValid(controlName) {
35 | return this.myForm.get(controlName).invalid && this.myForm.get(controlName).touched;
36 | }
37 |
38 | passValidator(control: AbstractControl) {
39 | if (control && (control.value !== null || control.value !== undefined)) {
40 | const cnfpassValue = control.value;
41 |
42 | const passControl = control.root.get('password');
43 | if (passControl) {
44 | const passValue = passControl.value;
45 | if (passValue !== cnfpassValue || passValue === '') {
46 | return {
47 | isError: true
48 | };
49 | }
50 | }
51 | }
52 |
53 | return null;
54 | }
55 |
56 | register() {
57 | console.log(this.myForm.value);
58 |
59 | if (this.myForm.valid) {
60 | this._myservice.submitRegister(this.myForm.value)
61 | .subscribe(
62 | data => this.successMessage = 'Registration Success',
63 | error => this.successMessage = 'SOme error'
64 | );
65 | }
66 | }
67 |
68 | movetologin() {
69 | this._router.navigate(['../login'], { relativeTo: this._activatedRoute });
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/angular/src/app/user-dashboard/user-dashboard.component.css:
--------------------------------------------------------------------------------
1 | .container{
2 | display: flex;
3 | justify-content: center;
4 | flex-direction: column;
5 | align-items: center;
6 | }
7 |
8 | .boom{
9 | width: 60%;
10 | background-color: #e9ecef;
11 | padding: 4rem;
12 | border-radius: .3rem;
13 | font-family: 'Lato';
14 | margin-top: 40px;
15 | }
16 |
17 | h2 {
18 | color: #212121;
19 | }
20 | .headerbar {
21 | padding: 10px;
22 | width: 100%;
23 | background-color:cornflowerblue;
24 | }
25 | .headerbar > span{
26 | font-family: 'Lobster', cursive;
27 | font-size: 2rem;
28 | margin-left: 20px;
29 | color: white;
30 | text-shadow: 2px 2px rgba(0, 0, 0, 0.5);
31 | }
--------------------------------------------------------------------------------
/angular/src/app/user-dashboard/user-dashboard.component.html:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
Hello {{username}}
you have successfully logged in using JWT.
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/angular/src/app/user-dashboard/user-dashboard.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { UserDashboardComponent } from './user-dashboard.component';
4 |
5 | describe('UserDashboardComponent', () => {
6 | let component: UserDashboardComponent;
7 | let fixture: ComponentFixture;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ UserDashboardComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(UserDashboardComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/angular/src/app/user-dashboard/user-dashboard.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { MyserviceService } from '../myservice.service';
3 | import { Router } from '@angular/router';
4 |
5 | @Component({
6 | selector: 'app-user-dashboard',
7 | templateUrl: './user-dashboard.component.html',
8 | styleUrls: ['./user-dashboard.component.css']
9 | })
10 | export class UserDashboardComponent implements OnInit {
11 |
12 | username = '';
13 | constructor(private myService:MyserviceService,
14 | private _router: Router) {
15 | this.myService.getUserName()
16 | .subscribe(
17 | data => this.username= data.toString(),
18 | error => this._router.navigate(['/main/login'])
19 | )
20 | }
21 |
22 | ngOnInit() {
23 | }
24 |
25 | logout(){
26 | localStorage.removeItem('token');
27 | this._router.navigate(['/main/login']);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/angular/src/assets/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AzharHusain/token-based-authentication/315651cebfcc4be2ef57394fe48f6a69aa6da41a/angular/src/assets/.gitkeep
--------------------------------------------------------------------------------
/angular/src/assets/images/back1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AzharHusain/token-based-authentication/315651cebfcc4be2ef57394fe48f6a69aa6da41a/angular/src/assets/images/back1.jpg
--------------------------------------------------------------------------------
/angular/src/environments/environment.prod.ts:
--------------------------------------------------------------------------------
1 | export const environment = {
2 | production: true
3 | };
4 |
--------------------------------------------------------------------------------
/angular/src/environments/environment.ts:
--------------------------------------------------------------------------------
1 | // The file contents for the current environment will overwrite these during build.
2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do
3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead.
4 | // The list of which env maps to which file can be found in `.angular-cli.json`.
5 |
6 | export const environment = {
7 | production: false
8 | };
9 |
--------------------------------------------------------------------------------
/angular/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AzharHusain/token-based-authentication/315651cebfcc4be2ef57394fe48f6a69aa6da41a/angular/src/favicon.ico
--------------------------------------------------------------------------------
/angular/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Angular
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/angular/src/main.ts:
--------------------------------------------------------------------------------
1 | import { enableProdMode } from '@angular/core';
2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
3 |
4 | import { AppModule } from './app/app.module';
5 | import { environment } from './environments/environment';
6 |
7 | if (environment.production) {
8 | enableProdMode();
9 | }
10 |
11 | platformBrowserDynamic().bootstrapModule(AppModule)
12 | .catch(err => console.log(err));
13 |
--------------------------------------------------------------------------------
/angular/src/polyfills.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * This file includes polyfills needed by Angular and is loaded before the app.
3 | * You can add your own extra polyfills to this file.
4 | *
5 | * This file is divided into 2 sections:
6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
8 | * file.
9 | *
10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
13 | *
14 | * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
15 | */
16 |
17 | /***************************************************************************************************
18 | * BROWSER POLYFILLS
19 | */
20 |
21 | /** IE9, IE10 and IE11 requires all of the following polyfills. **/
22 | // import 'core-js/es6/symbol';
23 | // import 'core-js/es6/object';
24 | // import 'core-js/es6/function';
25 | // import 'core-js/es6/parse-int';
26 | // import 'core-js/es6/parse-float';
27 | // import 'core-js/es6/number';
28 | // import 'core-js/es6/math';
29 | // import 'core-js/es6/string';
30 | // import 'core-js/es6/date';
31 | // import 'core-js/es6/array';
32 | // import 'core-js/es6/regexp';
33 | // import 'core-js/es6/map';
34 | // import 'core-js/es6/weak-map';
35 | // import 'core-js/es6/set';
36 |
37 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */
38 | // import 'classlist.js'; // Run `npm install --save classlist.js`.
39 |
40 | /** IE10 and IE11 requires the following for the Reflect API. */
41 | // import 'core-js/es6/reflect';
42 |
43 |
44 | /** Evergreen browsers require these. **/
45 | // Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
46 | import 'core-js/es7/reflect';
47 |
48 |
49 | /**
50 | * Required to support Web Animations `@angular/platform-browser/animations`.
51 | * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
52 | **/
53 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`.
54 |
55 | /**
56 | * By default, zone.js will patch all possible macroTask and DomEvents
57 | * user can disable parts of macroTask/DomEvents patch by setting following flags
58 | */
59 |
60 | // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
61 | // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
62 | // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
63 |
64 | /*
65 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
66 | * with the following flag, it will bypass `zone.js` patch for IE/Edge
67 | */
68 | // (window as any).__Zone_enable_cross_context_check = true;
69 |
70 | /***************************************************************************************************
71 | * Zone JS is required by default for Angular itself.
72 | */
73 | import 'zone.js/dist/zone'; // Included with Angular CLI.
74 |
75 |
76 |
77 | /***************************************************************************************************
78 | * APPLICATION IMPORTS
79 | */
80 |
--------------------------------------------------------------------------------
/angular/src/styles.css:
--------------------------------------------------------------------------------
1 |
2 | @import "~@angular/material/prebuilt-themes/indigo-pink.css";
3 | /* You can add global styles to this file, and also import other style files */
4 | body {
5 | margin: 0px;
6 | padding: 0px;
7 | font-size: 1rem;
8 | font-family: 'Roboto', sans-serif;
9 | }
10 |
11 | .form-btn {
12 | font-family: Poppins-Medium;
13 | font-size: 15px;
14 | color: #fff;
15 | line-height: 1.2;
16 | text-transform: uppercase;
17 |
18 | display: -webkit-box;
19 | display: -webkit-flex;
20 | display: -moz-box;
21 | display: -ms-flexbox;
22 | display: flex;
23 | justify-content: center;
24 | align-items: center;
25 | padding: 0 20px;
26 | width: 100%;
27 | height: 50px;
28 | border-radius: 25px;
29 | background-color: turquoise;
30 | outline: none;
31 | border: 0px;
32 | cursor: pointer;
33 | }
34 |
35 | .form-btn-hollow {
36 | font-family: Poppins-Medium;
37 | font-size: 15px;
38 | color: turquoise;
39 | line-height: 1.2;
40 | text-transform: uppercase;
41 | background-color:transparent;
42 | display: -webkit-box;
43 | display: -webkit-flex;
44 | display: -moz-box;
45 | display: -ms-flexbox;
46 | display: flex;
47 | justify-content: center;
48 | align-items: center;
49 | padding: 0 20px;
50 | width: 100%;
51 | height: 50px;
52 | border-radius: 25px;
53 | border:1px solid turquoise;
54 | outline: none;
55 | cursor: pointer;
56 | font-weight: bold;
57 | }
58 |
59 | .form-btn-hollow:hover{
60 | background-color: rgba(0, 0, 0, 0.5);
61 | }
--------------------------------------------------------------------------------
/angular/src/test.ts:
--------------------------------------------------------------------------------
1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files
2 |
3 | import 'zone.js/dist/zone-testing';
4 | import { getTestBed } from '@angular/core/testing';
5 | import {
6 | BrowserDynamicTestingModule,
7 | platformBrowserDynamicTesting
8 | } from '@angular/platform-browser-dynamic/testing';
9 |
10 | declare const require: any;
11 |
12 | // First, initialize the Angular testing environment.
13 | getTestBed().initTestEnvironment(
14 | BrowserDynamicTestingModule,
15 | platformBrowserDynamicTesting()
16 | );
17 | // Then we find all the tests.
18 | const context = require.context('./', true, /\.spec\.ts$/);
19 | // And load the modules.
20 | context.keys().map(context);
21 |
--------------------------------------------------------------------------------
/angular/src/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/app",
5 | "baseUrl": "./",
6 | "module": "es2015",
7 | "types": []
8 | },
9 | "exclude": [
10 | "test.ts",
11 | "**/*.spec.ts"
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/angular/src/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../out-tsc/spec",
5 | "baseUrl": "./",
6 | "module": "commonjs",
7 | "types": [
8 | "jasmine",
9 | "node"
10 | ]
11 | },
12 | "files": [
13 | "test.ts"
14 | ],
15 | "include": [
16 | "**/*.spec.ts",
17 | "**/*.d.ts"
18 | ]
19 | }
20 |
--------------------------------------------------------------------------------
/angular/src/typings.d.ts:
--------------------------------------------------------------------------------
1 | /* SystemJS module definition */
2 | declare var module: NodeModule;
3 | interface NodeModule {
4 | id: string;
5 | }
6 |
--------------------------------------------------------------------------------
/angular/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compileOnSave": false,
3 | "compilerOptions": {
4 | "outDir": "./dist/out-tsc",
5 | "sourceMap": true,
6 | "declaration": false,
7 | "moduleResolution": "node",
8 | "emitDecoratorMetadata": true,
9 | "experimentalDecorators": true,
10 | "target": "es5",
11 | "typeRoots": [
12 | "node_modules/@types"
13 | ],
14 | "lib": [
15 | "es2017",
16 | "dom"
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/angular/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "rulesDirectory": [
3 | "node_modules/codelyzer"
4 | ],
5 | "rules": {
6 | "arrow-return-shorthand": true,
7 | "callable-types": true,
8 | "class-name": true,
9 | "comment-format": [
10 | true,
11 | "check-space"
12 | ],
13 | "curly": true,
14 | "deprecation": {
15 | "severity": "warn"
16 | },
17 | "eofline": true,
18 | "forin": true,
19 | "import-blacklist": [
20 | true,
21 | "rxjs",
22 | "rxjs/Rx"
23 | ],
24 | "import-spacing": true,
25 | "indent": [
26 | true,
27 | "spaces"
28 | ],
29 | "interface-over-type-literal": true,
30 | "label-position": true,
31 | "max-line-length": [
32 | true,
33 | 140
34 | ],
35 | "member-access": false,
36 | "member-ordering": [
37 | true,
38 | {
39 | "order": [
40 | "static-field",
41 | "instance-field",
42 | "static-method",
43 | "instance-method"
44 | ]
45 | }
46 | ],
47 | "no-arg": true,
48 | "no-bitwise": true,
49 | "no-console": [
50 | true,
51 | "debug",
52 | "info",
53 | "time",
54 | "timeEnd",
55 | "trace"
56 | ],
57 | "no-construct": true,
58 | "no-debugger": true,
59 | "no-duplicate-super": true,
60 | "no-empty": false,
61 | "no-empty-interface": true,
62 | "no-eval": true,
63 | "no-inferrable-types": [
64 | true,
65 | "ignore-params"
66 | ],
67 | "no-misused-new": true,
68 | "no-non-null-assertion": true,
69 | "no-shadowed-variable": true,
70 | "no-string-literal": false,
71 | "no-string-throw": true,
72 | "no-switch-case-fall-through": true,
73 | "no-trailing-whitespace": true,
74 | "no-unnecessary-initializer": true,
75 | "no-unused-expression": true,
76 | "no-use-before-declare": true,
77 | "no-var-keyword": true,
78 | "object-literal-sort-keys": false,
79 | "one-line": [
80 | true,
81 | "check-open-brace",
82 | "check-catch",
83 | "check-else",
84 | "check-whitespace"
85 | ],
86 | "prefer-const": true,
87 | "quotemark": [
88 | true,
89 | "single"
90 | ],
91 | "radix": true,
92 | "semicolon": [
93 | true,
94 | "always"
95 | ],
96 | "triple-equals": [
97 | true,
98 | "allow-null-check"
99 | ],
100 | "typedef-whitespace": [
101 | true,
102 | {
103 | "call-signature": "nospace",
104 | "index-signature": "nospace",
105 | "parameter": "nospace",
106 | "property-declaration": "nospace",
107 | "variable-declaration": "nospace"
108 | }
109 | ],
110 | "unified-signatures": true,
111 | "variable-name": false,
112 | "whitespace": [
113 | true,
114 | "check-branch",
115 | "check-decl",
116 | "check-operator",
117 | "check-separator",
118 | "check-type"
119 | ],
120 | "directive-selector": [
121 | true,
122 | "attribute",
123 | "app",
124 | "camelCase"
125 | ],
126 | "component-selector": [
127 | true,
128 | "element",
129 | "app",
130 | "kebab-case"
131 | ],
132 | "no-output-on-prefix": true,
133 | "use-input-property-decorator": true,
134 | "use-output-property-decorator": true,
135 | "use-host-property-decorator": true,
136 | "no-input-rename": true,
137 | "no-output-rename": true,
138 | "use-life-cycle-interface": true,
139 | "use-pipe-transform-interface": true,
140 | "component-class-suffix": true,
141 | "directive-class-suffix": true
142 | }
143 | }
144 |
--------------------------------------------------------------------------------
/backend/app.js:
--------------------------------------------------------------------------------
1 | var createError = require('http-errors');
2 | var express = require('express');
3 | var path = require('path');
4 | var cookieParser = require('cookie-parser');
5 | var logger = require('morgan');
6 |
7 | var indexRouter = require('./routes/index');
8 | var usersRouter = require('./routes/users');
9 |
10 | var app = express();
11 |
12 | // add mongoose
13 | var mongoose = require('mongoose');
14 | mongoose.connect('mongodb://localhost/ricker');
15 |
16 | // add cors
17 | var cors = require('cors');
18 | app.use(cors({
19 | origin:'http://localhost:4200'
20 | }));
21 |
22 |
23 | // view engine setup
24 | app.set('views', path.join(__dirname, 'views'));
25 | app.set('view engine', 'ejs');
26 |
27 | app.use(logger('dev'));
28 | app.use(express.json());
29 | app.use(express.urlencoded({ extended: false }));
30 | app.use(cookieParser());
31 | app.use(express.static(path.join(__dirname, 'public')));
32 |
33 | app.use('/', indexRouter);
34 | app.use('/users', usersRouter);
35 |
36 | // catch 404 and forward to error handler
37 | app.use(function(req, res, next) {
38 | next(createError(404));
39 | });
40 |
41 | // error handler
42 | app.use(function(err, req, res, next) {
43 | // set locals, only providing error in development
44 | res.locals.message = err.message;
45 | res.locals.error = req.app.get('env') === 'development' ? err : {};
46 |
47 | // render the error page
48 | res.status(err.status || 500);
49 | res.render('error');
50 | });
51 |
52 | module.exports = app;
53 |
--------------------------------------------------------------------------------
/backend/bin/www:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /**
4 | * Module dependencies.
5 | */
6 |
7 | var app = require('../app');
8 | var debug = require('debug')('backend:server');
9 | var http = require('http');
10 |
11 | /**
12 | * Get port from environment and store in Express.
13 | */
14 |
15 | var port = normalizePort(process.env.PORT || '3000');
16 | app.set('port', port);
17 |
18 | /**
19 | * Create HTTP server.
20 | */
21 |
22 | var server = http.createServer(app);
23 |
24 | /**
25 | * Listen on provided port, on all network interfaces.
26 | */
27 |
28 | server.listen(port);
29 | server.on('error', onError);
30 | server.on('listening', onListening);
31 |
32 | /**
33 | * Normalize a port into a number, string, or false.
34 | */
35 |
36 | function normalizePort(val) {
37 | var port = parseInt(val, 10);
38 |
39 | if (isNaN(port)) {
40 | // named pipe
41 | return val;
42 | }
43 |
44 | if (port >= 0) {
45 | // port number
46 | return port;
47 | }
48 |
49 | return false;
50 | }
51 |
52 | /**
53 | * Event listener for HTTP server "error" event.
54 | */
55 |
56 | function onError(error) {
57 | if (error.syscall !== 'listen') {
58 | throw error;
59 | }
60 |
61 | var bind = typeof port === 'string'
62 | ? 'Pipe ' + port
63 | : 'Port ' + port;
64 |
65 | // handle specific listen errors with friendly messages
66 | switch (error.code) {
67 | case 'EACCES':
68 | console.error(bind + ' requires elevated privileges');
69 | process.exit(1);
70 | break;
71 | case 'EADDRINUSE':
72 | console.error(bind + ' is already in use');
73 | process.exit(1);
74 | break;
75 | default:
76 | throw error;
77 | }
78 | }
79 |
80 | /**
81 | * Event listener for HTTP server "listening" event.
82 | */
83 |
84 | function onListening() {
85 | var addr = server.address();
86 | var bind = typeof addr === 'string'
87 | ? 'pipe ' + addr
88 | : 'port ' + addr.port;
89 | debug('Listening on ' + bind);
90 | }
91 |
--------------------------------------------------------------------------------
/backend/models/user.js:
--------------------------------------------------------------------------------
1 | var mongoose = require('mongoose');
2 | var Schema = mongoose.Schema;
3 | var bcrypt = require('bcrypt');
4 |
5 | var schema = new Schema({
6 | email : {type:String, require:true},
7 | username: {type:String, require:true},
8 | password:{type:String, require:true},
9 | creation_dt:{type:Date, require:true}
10 | });
11 |
12 | schema.statics.hashPassword = function hashPassword(password){
13 | return bcrypt.hashSync(password,10);
14 | }
15 |
16 | schema.methods.isValid = function(hashedpassword){
17 | return bcrypt.compareSync(hashedpassword, this.password);
18 | }
19 |
20 | module.exports = mongoose.model('User',schema);
--------------------------------------------------------------------------------
/backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "0.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "accepts": {
8 | "version": "1.3.5",
9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
11 | "requires": {
12 | "mime-types": "2.1.18",
13 | "negotiator": "0.6.1"
14 | }
15 | },
16 | "array-flatten": {
17 | "version": "1.1.1",
18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
20 | },
21 | "async": {
22 | "version": "2.1.4",
23 | "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz",
24 | "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=",
25 | "requires": {
26 | "lodash": "4.17.10"
27 | }
28 | },
29 | "basic-auth": {
30 | "version": "2.0.0",
31 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz",
32 | "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=",
33 | "requires": {
34 | "safe-buffer": "5.1.1"
35 | }
36 | },
37 | "bcrypt": {
38 | "version": "2.0.1",
39 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-2.0.1.tgz",
40 | "integrity": "sha512-DwB7WgJPdskbR+9Y3OTJtwRq09Lmm7Na6b+4ewvXjkD0nfNRi1OozxljHm5ETlDCBq9DTy04lQz+rj+T2ztIJg==",
41 | "requires": {
42 | "nan": "2.10.0",
43 | "node-pre-gyp": "0.9.1"
44 | },
45 | "dependencies": {
46 | "abbrev": {
47 | "version": "1.1.1",
48 | "bundled": true
49 | },
50 | "ansi-regex": {
51 | "version": "2.1.1",
52 | "bundled": true
53 | },
54 | "aproba": {
55 | "version": "1.2.0",
56 | "bundled": true
57 | },
58 | "are-we-there-yet": {
59 | "version": "1.1.4",
60 | "bundled": true,
61 | "requires": {
62 | "delegates": "1.0.0",
63 | "readable-stream": "2.3.5"
64 | }
65 | },
66 | "balanced-match": {
67 | "version": "1.0.0",
68 | "bundled": true
69 | },
70 | "brace-expansion": {
71 | "version": "1.1.11",
72 | "bundled": true,
73 | "requires": {
74 | "balanced-match": "1.0.0",
75 | "concat-map": "0.0.1"
76 | }
77 | },
78 | "chownr": {
79 | "version": "1.0.1",
80 | "bundled": true
81 | },
82 | "code-point-at": {
83 | "version": "1.1.0",
84 | "bundled": true
85 | },
86 | "concat-map": {
87 | "version": "0.0.1",
88 | "bundled": true
89 | },
90 | "console-control-strings": {
91 | "version": "1.1.0",
92 | "bundled": true
93 | },
94 | "core-util-is": {
95 | "version": "1.0.2",
96 | "bundled": true
97 | },
98 | "debug": {
99 | "version": "2.6.9",
100 | "bundled": true,
101 | "requires": {
102 | "ms": "2.0.0"
103 | }
104 | },
105 | "deep-extend": {
106 | "version": "0.4.2",
107 | "bundled": true
108 | },
109 | "delegates": {
110 | "version": "1.0.0",
111 | "bundled": true
112 | },
113 | "detect-libc": {
114 | "version": "1.0.3",
115 | "bundled": true
116 | },
117 | "fs-minipass": {
118 | "version": "1.2.5",
119 | "bundled": true,
120 | "requires": {
121 | "minipass": "2.2.4"
122 | }
123 | },
124 | "fs.realpath": {
125 | "version": "1.0.0",
126 | "bundled": true
127 | },
128 | "gauge": {
129 | "version": "2.7.4",
130 | "bundled": true,
131 | "requires": {
132 | "aproba": "1.2.0",
133 | "console-control-strings": "1.1.0",
134 | "has-unicode": "2.0.1",
135 | "object-assign": "4.1.1",
136 | "signal-exit": "3.0.2",
137 | "string-width": "1.0.2",
138 | "strip-ansi": "3.0.1",
139 | "wide-align": "1.1.2"
140 | }
141 | },
142 | "glob": {
143 | "version": "7.1.2",
144 | "bundled": true,
145 | "requires": {
146 | "fs.realpath": "1.0.0",
147 | "inflight": "1.0.6",
148 | "inherits": "2.0.3",
149 | "minimatch": "3.0.4",
150 | "once": "1.4.0",
151 | "path-is-absolute": "1.0.1"
152 | }
153 | },
154 | "has-unicode": {
155 | "version": "2.0.1",
156 | "bundled": true
157 | },
158 | "iconv-lite": {
159 | "version": "0.4.21",
160 | "bundled": true,
161 | "requires": {
162 | "safer-buffer": "2.1.2"
163 | }
164 | },
165 | "ignore-walk": {
166 | "version": "3.0.1",
167 | "bundled": true,
168 | "requires": {
169 | "minimatch": "3.0.4"
170 | }
171 | },
172 | "inflight": {
173 | "version": "1.0.6",
174 | "bundled": true,
175 | "requires": {
176 | "once": "1.4.0",
177 | "wrappy": "1.0.2"
178 | }
179 | },
180 | "inherits": {
181 | "version": "2.0.3",
182 | "bundled": true
183 | },
184 | "ini": {
185 | "version": "1.3.5",
186 | "bundled": true
187 | },
188 | "is-fullwidth-code-point": {
189 | "version": "1.0.0",
190 | "bundled": true,
191 | "requires": {
192 | "number-is-nan": "1.0.1"
193 | }
194 | },
195 | "isarray": {
196 | "version": "1.0.0",
197 | "bundled": true
198 | },
199 | "minimatch": {
200 | "version": "3.0.4",
201 | "bundled": true,
202 | "requires": {
203 | "brace-expansion": "1.1.11"
204 | }
205 | },
206 | "minimist": {
207 | "version": "0.0.8",
208 | "bundled": true
209 | },
210 | "minipass": {
211 | "version": "2.2.4",
212 | "bundled": true,
213 | "requires": {
214 | "safe-buffer": "5.1.1",
215 | "yallist": "3.0.2"
216 | },
217 | "dependencies": {
218 | "yallist": {
219 | "version": "3.0.2",
220 | "bundled": true
221 | }
222 | }
223 | },
224 | "minizlib": {
225 | "version": "1.1.0",
226 | "bundled": true,
227 | "requires": {
228 | "minipass": "2.2.4"
229 | }
230 | },
231 | "mkdirp": {
232 | "version": "0.5.1",
233 | "bundled": true,
234 | "requires": {
235 | "minimist": "0.0.8"
236 | }
237 | },
238 | "ms": {
239 | "version": "2.0.0",
240 | "bundled": true
241 | },
242 | "needle": {
243 | "version": "2.2.0",
244 | "bundled": true,
245 | "requires": {
246 | "debug": "2.6.9",
247 | "iconv-lite": "0.4.21",
248 | "sax": "1.2.4"
249 | }
250 | },
251 | "node-pre-gyp": {
252 | "version": "0.9.1",
253 | "bundled": true,
254 | "requires": {
255 | "detect-libc": "1.0.3",
256 | "mkdirp": "0.5.1",
257 | "needle": "2.2.0",
258 | "nopt": "4.0.1",
259 | "npm-packlist": "1.1.10",
260 | "npmlog": "4.1.2",
261 | "rc": "1.2.6",
262 | "rimraf": "2.6.2",
263 | "semver": "5.5.0",
264 | "tar": "4.4.1"
265 | }
266 | },
267 | "nopt": {
268 | "version": "4.0.1",
269 | "bundled": true,
270 | "requires": {
271 | "abbrev": "1.1.1",
272 | "osenv": "0.1.5"
273 | }
274 | },
275 | "npm-bundled": {
276 | "version": "1.0.3",
277 | "bundled": true
278 | },
279 | "npm-packlist": {
280 | "version": "1.1.10",
281 | "bundled": true,
282 | "requires": {
283 | "ignore-walk": "3.0.1",
284 | "npm-bundled": "1.0.3"
285 | }
286 | },
287 | "npmlog": {
288 | "version": "4.1.2",
289 | "bundled": true,
290 | "requires": {
291 | "are-we-there-yet": "1.1.4",
292 | "console-control-strings": "1.1.0",
293 | "gauge": "2.7.4",
294 | "set-blocking": "2.0.0"
295 | }
296 | },
297 | "number-is-nan": {
298 | "version": "1.0.1",
299 | "bundled": true
300 | },
301 | "object-assign": {
302 | "version": "4.1.1",
303 | "bundled": true
304 | },
305 | "once": {
306 | "version": "1.4.0",
307 | "bundled": true,
308 | "requires": {
309 | "wrappy": "1.0.2"
310 | }
311 | },
312 | "os-homedir": {
313 | "version": "1.0.2",
314 | "bundled": true
315 | },
316 | "os-tmpdir": {
317 | "version": "1.0.2",
318 | "bundled": true
319 | },
320 | "osenv": {
321 | "version": "0.1.5",
322 | "bundled": true,
323 | "requires": {
324 | "os-homedir": "1.0.2",
325 | "os-tmpdir": "1.0.2"
326 | }
327 | },
328 | "path-is-absolute": {
329 | "version": "1.0.1",
330 | "bundled": true
331 | },
332 | "process-nextick-args": {
333 | "version": "2.0.0",
334 | "bundled": true
335 | },
336 | "rc": {
337 | "version": "1.2.6",
338 | "bundled": true,
339 | "requires": {
340 | "deep-extend": "0.4.2",
341 | "ini": "1.3.5",
342 | "minimist": "1.2.0",
343 | "strip-json-comments": "2.0.1"
344 | },
345 | "dependencies": {
346 | "minimist": {
347 | "version": "1.2.0",
348 | "bundled": true
349 | }
350 | }
351 | },
352 | "readable-stream": {
353 | "version": "2.3.5",
354 | "bundled": true,
355 | "requires": {
356 | "core-util-is": "1.0.2",
357 | "inherits": "2.0.3",
358 | "isarray": "1.0.0",
359 | "process-nextick-args": "2.0.0",
360 | "safe-buffer": "5.1.1",
361 | "string_decoder": "1.0.3",
362 | "util-deprecate": "1.0.2"
363 | }
364 | },
365 | "rimraf": {
366 | "version": "2.6.2",
367 | "bundled": true,
368 | "requires": {
369 | "glob": "7.1.2"
370 | }
371 | },
372 | "safe-buffer": {
373 | "version": "5.1.1",
374 | "bundled": true
375 | },
376 | "safer-buffer": {
377 | "version": "2.1.2",
378 | "bundled": true
379 | },
380 | "sax": {
381 | "version": "1.2.4",
382 | "bundled": true
383 | },
384 | "semver": {
385 | "version": "5.5.0",
386 | "bundled": true
387 | },
388 | "set-blocking": {
389 | "version": "2.0.0",
390 | "bundled": true
391 | },
392 | "signal-exit": {
393 | "version": "3.0.2",
394 | "bundled": true
395 | },
396 | "string-width": {
397 | "version": "1.0.2",
398 | "bundled": true,
399 | "requires": {
400 | "code-point-at": "1.1.0",
401 | "is-fullwidth-code-point": "1.0.0",
402 | "strip-ansi": "3.0.1"
403 | }
404 | },
405 | "string_decoder": {
406 | "version": "1.0.3",
407 | "bundled": true,
408 | "requires": {
409 | "safe-buffer": "5.1.1"
410 | }
411 | },
412 | "strip-ansi": {
413 | "version": "3.0.1",
414 | "bundled": true,
415 | "requires": {
416 | "ansi-regex": "2.1.1"
417 | }
418 | },
419 | "strip-json-comments": {
420 | "version": "2.0.1",
421 | "bundled": true
422 | },
423 | "tar": {
424 | "version": "4.4.1",
425 | "bundled": true,
426 | "requires": {
427 | "chownr": "1.0.1",
428 | "fs-minipass": "1.2.5",
429 | "minipass": "2.2.4",
430 | "minizlib": "1.1.0",
431 | "mkdirp": "0.5.1",
432 | "safe-buffer": "5.1.1",
433 | "yallist": "3.0.2"
434 | },
435 | "dependencies": {
436 | "yallist": {
437 | "version": "3.0.2",
438 | "bundled": true
439 | }
440 | }
441 | },
442 | "util-deprecate": {
443 | "version": "1.0.2",
444 | "bundled": true
445 | },
446 | "wide-align": {
447 | "version": "1.1.2",
448 | "bundled": true,
449 | "requires": {
450 | "string-width": "1.0.2"
451 | }
452 | },
453 | "wrappy": {
454 | "version": "1.0.2",
455 | "bundled": true
456 | }
457 | }
458 | },
459 | "bluebird": {
460 | "version": "3.5.0",
461 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
462 | "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw="
463 | },
464 | "body-parser": {
465 | "version": "1.18.2",
466 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
467 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
468 | "requires": {
469 | "bytes": "3.0.0",
470 | "content-type": "1.0.4",
471 | "debug": "2.6.9",
472 | "depd": "1.1.2",
473 | "http-errors": "1.6.3",
474 | "iconv-lite": "0.4.19",
475 | "on-finished": "2.3.0",
476 | "qs": "6.5.1",
477 | "raw-body": "2.3.2",
478 | "type-is": "1.6.16"
479 | }
480 | },
481 | "bson": {
482 | "version": "1.0.6",
483 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz",
484 | "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ=="
485 | },
486 | "buffer-equal-constant-time": {
487 | "version": "1.0.1",
488 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
489 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
490 | },
491 | "bytes": {
492 | "version": "3.0.0",
493 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
494 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
495 | },
496 | "content-disposition": {
497 | "version": "0.5.2",
498 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
499 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
500 | },
501 | "content-type": {
502 | "version": "1.0.4",
503 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
504 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
505 | },
506 | "cookie": {
507 | "version": "0.3.1",
508 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
509 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
510 | },
511 | "cookie-parser": {
512 | "version": "1.4.3",
513 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz",
514 | "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=",
515 | "requires": {
516 | "cookie": "0.3.1",
517 | "cookie-signature": "1.0.6"
518 | }
519 | },
520 | "cookie-signature": {
521 | "version": "1.0.6",
522 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
523 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
524 | },
525 | "cors": {
526 | "version": "2.8.4",
527 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz",
528 | "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=",
529 | "requires": {
530 | "object-assign": "4.1.1",
531 | "vary": "1.1.2"
532 | }
533 | },
534 | "debug": {
535 | "version": "2.6.9",
536 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
537 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
538 | "requires": {
539 | "ms": "2.0.0"
540 | }
541 | },
542 | "depd": {
543 | "version": "1.1.2",
544 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
545 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
546 | },
547 | "destroy": {
548 | "version": "1.0.4",
549 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
550 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
551 | },
552 | "ecdsa-sig-formatter": {
553 | "version": "1.0.10",
554 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz",
555 | "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=",
556 | "requires": {
557 | "safe-buffer": "5.1.1"
558 | }
559 | },
560 | "ee-first": {
561 | "version": "1.1.1",
562 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
563 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
564 | },
565 | "ejs": {
566 | "version": "2.5.9",
567 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz",
568 | "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ=="
569 | },
570 | "encodeurl": {
571 | "version": "1.0.2",
572 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
573 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
574 | },
575 | "escape-html": {
576 | "version": "1.0.3",
577 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
578 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
579 | },
580 | "etag": {
581 | "version": "1.8.1",
582 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
583 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
584 | },
585 | "express": {
586 | "version": "4.16.3",
587 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
588 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
589 | "requires": {
590 | "accepts": "1.3.5",
591 | "array-flatten": "1.1.1",
592 | "body-parser": "1.18.2",
593 | "content-disposition": "0.5.2",
594 | "content-type": "1.0.4",
595 | "cookie": "0.3.1",
596 | "cookie-signature": "1.0.6",
597 | "debug": "2.6.9",
598 | "depd": "1.1.2",
599 | "encodeurl": "1.0.2",
600 | "escape-html": "1.0.3",
601 | "etag": "1.8.1",
602 | "finalhandler": "1.1.1",
603 | "fresh": "0.5.2",
604 | "merge-descriptors": "1.0.1",
605 | "methods": "1.1.2",
606 | "on-finished": "2.3.0",
607 | "parseurl": "1.3.2",
608 | "path-to-regexp": "0.1.7",
609 | "proxy-addr": "2.0.3",
610 | "qs": "6.5.1",
611 | "range-parser": "1.2.0",
612 | "safe-buffer": "5.1.1",
613 | "send": "0.16.2",
614 | "serve-static": "1.13.2",
615 | "setprototypeof": "1.1.0",
616 | "statuses": "1.4.0",
617 | "type-is": "1.6.16",
618 | "utils-merge": "1.0.1",
619 | "vary": "1.1.2"
620 | }
621 | },
622 | "finalhandler": {
623 | "version": "1.1.1",
624 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
625 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
626 | "requires": {
627 | "debug": "2.6.9",
628 | "encodeurl": "1.0.2",
629 | "escape-html": "1.0.3",
630 | "on-finished": "2.3.0",
631 | "parseurl": "1.3.2",
632 | "statuses": "1.4.0",
633 | "unpipe": "1.0.0"
634 | }
635 | },
636 | "forwarded": {
637 | "version": "0.1.2",
638 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
639 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
640 | },
641 | "fresh": {
642 | "version": "0.5.2",
643 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
644 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
645 | },
646 | "http-errors": {
647 | "version": "1.6.3",
648 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
649 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
650 | "requires": {
651 | "depd": "1.1.2",
652 | "inherits": "2.0.3",
653 | "setprototypeof": "1.1.0",
654 | "statuses": "1.4.0"
655 | }
656 | },
657 | "iconv-lite": {
658 | "version": "0.4.19",
659 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
660 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
661 | },
662 | "inherits": {
663 | "version": "2.0.3",
664 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
665 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
666 | },
667 | "ipaddr.js": {
668 | "version": "1.6.0",
669 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
670 | "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs="
671 | },
672 | "jsonwebtoken": {
673 | "version": "8.2.1",
674 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz",
675 | "integrity": "sha512-l8rUBr0fqYYwPc8/ZGrue7GiW7vWdZtZqelxo4Sd5lMvuEeCK8/wS54sEo6tJhdZ6hqfutsj6COgC0d1XdbHGw==",
676 | "requires": {
677 | "jws": "3.1.5",
678 | "lodash.includes": "4.3.0",
679 | "lodash.isboolean": "3.0.3",
680 | "lodash.isinteger": "4.0.4",
681 | "lodash.isnumber": "3.0.3",
682 | "lodash.isplainobject": "4.0.6",
683 | "lodash.isstring": "4.0.1",
684 | "lodash.once": "4.1.1",
685 | "ms": "2.1.1",
686 | "xtend": "4.0.1"
687 | },
688 | "dependencies": {
689 | "ms": {
690 | "version": "2.1.1",
691 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
692 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
693 | }
694 | }
695 | },
696 | "jwa": {
697 | "version": "1.1.6",
698 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz",
699 | "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==",
700 | "requires": {
701 | "buffer-equal-constant-time": "1.0.1",
702 | "ecdsa-sig-formatter": "1.0.10",
703 | "safe-buffer": "5.1.1"
704 | }
705 | },
706 | "jws": {
707 | "version": "3.1.5",
708 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz",
709 | "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==",
710 | "requires": {
711 | "jwa": "1.1.6",
712 | "safe-buffer": "5.1.1"
713 | }
714 | },
715 | "kareem": {
716 | "version": "2.1.0",
717 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.1.0.tgz",
718 | "integrity": "sha512-ycoMY1tVkcH1/NaxGn2erZaUC3CodmX7Fl6DUVXjN73+uecWYTaaldRkxNY3HeSKQnQTWnoxRKnZfVHcB8tIWg=="
719 | },
720 | "lodash": {
721 | "version": "4.17.10",
722 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
723 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
724 | },
725 | "lodash.get": {
726 | "version": "4.4.2",
727 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
728 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
729 | },
730 | "lodash.includes": {
731 | "version": "4.3.0",
732 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
733 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
734 | },
735 | "lodash.isboolean": {
736 | "version": "3.0.3",
737 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
738 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
739 | },
740 | "lodash.isinteger": {
741 | "version": "4.0.4",
742 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
743 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
744 | },
745 | "lodash.isnumber": {
746 | "version": "3.0.3",
747 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
748 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
749 | },
750 | "lodash.isplainobject": {
751 | "version": "4.0.6",
752 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
753 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
754 | },
755 | "lodash.isstring": {
756 | "version": "4.0.1",
757 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
758 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
759 | },
760 | "lodash.once": {
761 | "version": "4.1.1",
762 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
763 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
764 | },
765 | "media-typer": {
766 | "version": "0.3.0",
767 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
768 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
769 | },
770 | "merge-descriptors": {
771 | "version": "1.0.1",
772 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
773 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
774 | },
775 | "methods": {
776 | "version": "1.1.2",
777 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
778 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
779 | },
780 | "mime": {
781 | "version": "1.4.1",
782 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
783 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
784 | },
785 | "mime-db": {
786 | "version": "1.33.0",
787 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
788 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
789 | },
790 | "mime-types": {
791 | "version": "2.1.18",
792 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
793 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
794 | "requires": {
795 | "mime-db": "1.33.0"
796 | }
797 | },
798 | "mongodb": {
799 | "version": "3.0.8",
800 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.8.tgz",
801 | "integrity": "sha512-mj7yIUyAr9xnO2ev8pcVJ9uX7gSum5LLs1qIFoWLxA5Il50+jcojKtaO1/TbexsScZ9Poz00Pc3b86GiSqJ7WA==",
802 | "requires": {
803 | "mongodb-core": "3.0.8"
804 | }
805 | },
806 | "mongodb-core": {
807 | "version": "3.0.8",
808 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.8.tgz",
809 | "integrity": "sha512-dFxfhH9N7ohuQnINyIl6dqEF8sYOE0WKuymrFf3L3cipJNrx+S8rAbNOTwa00/fuJCjBMJNFsaA+R2N16//UIw==",
810 | "requires": {
811 | "bson": "1.0.6",
812 | "require_optional": "1.0.1"
813 | }
814 | },
815 | "mongoose": {
816 | "version": "5.1.2",
817 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.1.2.tgz",
818 | "integrity": "sha512-k9hssPMgBnUYG5e9NoUbx/2ERDyelDY0Vf6BwjtmoETUhVT7pQUe1o+oelLLuHF3ZVY2qgienK8pnrI5pdvlxA==",
819 | "requires": {
820 | "async": "2.1.4",
821 | "bson": "1.0.6",
822 | "kareem": "2.1.0",
823 | "lodash.get": "4.4.2",
824 | "mongodb": "3.0.8",
825 | "mongoose-legacy-pluralize": "1.0.2",
826 | "mpath": "0.4.1",
827 | "mquery": "3.0.0",
828 | "ms": "2.0.0",
829 | "regexp-clone": "0.0.1",
830 | "sliced": "1.0.1"
831 | }
832 | },
833 | "mongoose-legacy-pluralize": {
834 | "version": "1.0.2",
835 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
836 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
837 | },
838 | "morgan": {
839 | "version": "1.9.0",
840 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz",
841 | "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=",
842 | "requires": {
843 | "basic-auth": "2.0.0",
844 | "debug": "2.6.9",
845 | "depd": "1.1.2",
846 | "on-finished": "2.3.0",
847 | "on-headers": "1.0.1"
848 | }
849 | },
850 | "mpath": {
851 | "version": "0.4.1",
852 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.4.1.tgz",
853 | "integrity": "sha512-NNY/MpBkALb9jJmjpBlIi6GRoLveLUM0pJzgbp9vY9F7IQEb/HREC/nxrixechcQwd1NevOhJnWWV8QQQRE+OA=="
854 | },
855 | "mquery": {
856 | "version": "3.0.0",
857 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.0.0.tgz",
858 | "integrity": "sha512-WL1Lk8v4l8VFSSwN3yCzY9TXw+fKVYKn6f+w86TRzOLSE8k1yTgGaLBPUByJQi8VcLbOdnUneFV/y3Kv874pnQ==",
859 | "requires": {
860 | "bluebird": "3.5.0",
861 | "debug": "2.6.9",
862 | "regexp-clone": "0.0.1",
863 | "sliced": "0.0.5"
864 | },
865 | "dependencies": {
866 | "sliced": {
867 | "version": "0.0.5",
868 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz",
869 | "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8="
870 | }
871 | }
872 | },
873 | "ms": {
874 | "version": "2.0.0",
875 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
876 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
877 | },
878 | "nan": {
879 | "version": "2.10.0",
880 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
881 | "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
882 | },
883 | "negotiator": {
884 | "version": "0.6.1",
885 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
886 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
887 | },
888 | "object-assign": {
889 | "version": "4.1.1",
890 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
891 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
892 | },
893 | "on-finished": {
894 | "version": "2.3.0",
895 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
896 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
897 | "requires": {
898 | "ee-first": "1.1.1"
899 | }
900 | },
901 | "on-headers": {
902 | "version": "1.0.1",
903 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
904 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
905 | },
906 | "parseurl": {
907 | "version": "1.3.2",
908 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
909 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
910 | },
911 | "path-to-regexp": {
912 | "version": "0.1.7",
913 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
914 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
915 | },
916 | "proxy-addr": {
917 | "version": "2.0.3",
918 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
919 | "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
920 | "requires": {
921 | "forwarded": "0.1.2",
922 | "ipaddr.js": "1.6.0"
923 | }
924 | },
925 | "qs": {
926 | "version": "6.5.1",
927 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
928 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
929 | },
930 | "range-parser": {
931 | "version": "1.2.0",
932 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
933 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
934 | },
935 | "raw-body": {
936 | "version": "2.3.2",
937 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
938 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
939 | "requires": {
940 | "bytes": "3.0.0",
941 | "http-errors": "1.6.2",
942 | "iconv-lite": "0.4.19",
943 | "unpipe": "1.0.0"
944 | },
945 | "dependencies": {
946 | "depd": {
947 | "version": "1.1.1",
948 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
949 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
950 | },
951 | "http-errors": {
952 | "version": "1.6.2",
953 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
954 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
955 | "requires": {
956 | "depd": "1.1.1",
957 | "inherits": "2.0.3",
958 | "setprototypeof": "1.0.3",
959 | "statuses": "1.4.0"
960 | }
961 | },
962 | "setprototypeof": {
963 | "version": "1.0.3",
964 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
965 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
966 | }
967 | }
968 | },
969 | "regexp-clone": {
970 | "version": "0.0.1",
971 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz",
972 | "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk="
973 | },
974 | "require_optional": {
975 | "version": "1.0.1",
976 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
977 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
978 | "requires": {
979 | "resolve-from": "2.0.0",
980 | "semver": "5.5.0"
981 | }
982 | },
983 | "resolve-from": {
984 | "version": "2.0.0",
985 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
986 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
987 | },
988 | "safe-buffer": {
989 | "version": "5.1.1",
990 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
991 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
992 | },
993 | "semver": {
994 | "version": "5.5.0",
995 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
996 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
997 | },
998 | "send": {
999 | "version": "0.16.2",
1000 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
1001 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
1002 | "requires": {
1003 | "debug": "2.6.9",
1004 | "depd": "1.1.2",
1005 | "destroy": "1.0.4",
1006 | "encodeurl": "1.0.2",
1007 | "escape-html": "1.0.3",
1008 | "etag": "1.8.1",
1009 | "fresh": "0.5.2",
1010 | "http-errors": "1.6.3",
1011 | "mime": "1.4.1",
1012 | "ms": "2.0.0",
1013 | "on-finished": "2.3.0",
1014 | "range-parser": "1.2.0",
1015 | "statuses": "1.4.0"
1016 | }
1017 | },
1018 | "serve-static": {
1019 | "version": "1.13.2",
1020 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
1021 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
1022 | "requires": {
1023 | "encodeurl": "1.0.2",
1024 | "escape-html": "1.0.3",
1025 | "parseurl": "1.3.2",
1026 | "send": "0.16.2"
1027 | }
1028 | },
1029 | "setprototypeof": {
1030 | "version": "1.1.0",
1031 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1032 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
1033 | },
1034 | "sliced": {
1035 | "version": "1.0.1",
1036 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
1037 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
1038 | },
1039 | "statuses": {
1040 | "version": "1.4.0",
1041 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
1042 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
1043 | },
1044 | "type-is": {
1045 | "version": "1.6.16",
1046 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
1047 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
1048 | "requires": {
1049 | "media-typer": "0.3.0",
1050 | "mime-types": "2.1.18"
1051 | }
1052 | },
1053 | "unpipe": {
1054 | "version": "1.0.0",
1055 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1056 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1057 | },
1058 | "utils-merge": {
1059 | "version": "1.0.1",
1060 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1061 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1062 | },
1063 | "vary": {
1064 | "version": "1.1.2",
1065 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1066 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1067 | },
1068 | "xtend": {
1069 | "version": "4.0.1",
1070 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
1071 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
1072 | }
1073 | }
1074 | }
1075 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "start": "node ./bin/www"
7 | },
8 | "dependencies": {
9 | "bcrypt": "^2.0.1",
10 | "cookie-parser": "~1.4.3",
11 | "cors": "^2.8.4",
12 | "debug": "~2.6.9",
13 | "ejs": "~2.5.7",
14 | "express": "~4.16.0",
15 | "http-errors": "~1.6.2",
16 | "jsonwebtoken": "^8.2.1",
17 | "mongoose": "^5.1.2",
18 | "morgan": "~1.9.0"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/backend/public/stylesheets/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 50px;
3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
4 | }
5 |
6 | a {
7 | color: #00B7FF;
8 | }
9 |
--------------------------------------------------------------------------------
/backend/routes/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var router = express.Router();
3 |
4 | /* GET home page. */
5 | router.get('/', function(req, res, next) {
6 | res.render('index', { title: 'Express' });
7 | });
8 |
9 | module.exports = router;
10 |
--------------------------------------------------------------------------------
/backend/routes/users.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var router = express.Router();
3 | var User = require('../models/user');
4 | var jwt = require('jsonwebtoken');
5 |
6 | router.post('/register', function(req,res,next){
7 | var user = new User({
8 | email: req.body.email,
9 | username: req.body.username,
10 | password: User.hashPassword(req.body.password),
11 | creation_dt: Date.now()
12 | });
13 |
14 | let promise = user.save();
15 |
16 | promise.then(function(doc){
17 | return res.status(201).json(doc);
18 | })
19 |
20 | promise.catch(function(err){
21 | return res.status(501).json({message: 'Error registering user.'})
22 | })
23 | })
24 |
25 | router.post('/login', function(req,res,next){
26 | let promise = User.findOne({email:req.body.email}).exec();
27 |
28 | promise.then(function(doc){
29 | if(doc) {
30 | if(doc.isValid(req.body.password)){
31 | // generate token
32 | let token = jwt.sign({username:doc.username},'secret', {expiresIn : '3h'});
33 |
34 | return res.status(200).json(token);
35 |
36 | } else {
37 | return res.status(501).json({message:' Invalid Credentials'});
38 | }
39 | }
40 | else {
41 | return res.status(501).json({message:'User email is not registered.'})
42 | }
43 | });
44 |
45 | promise.catch(function(err){
46 | return res.status(501).json({message:'Some internal error'});
47 | })
48 | })
49 |
50 | router.get('/username', verifyToken, function(req,res,next){
51 | return res.status(200).json(decodedToken.username);
52 | })
53 |
54 | var decodedToken='';
55 | function verifyToken(req,res,next){
56 | let token = req.query.token;
57 |
58 | jwt.verify(token,'secret', function(err, tokendata){
59 | if(err){
60 | return res.status(400).json({message:' Unauthorized request'});
61 | }
62 | if(tokendata){
63 | decodedToken = tokendata;
64 | next();
65 | }
66 | })
67 | }
68 |
69 | module.exports = router;
70 |
--------------------------------------------------------------------------------
/backend/views/error.ejs:
--------------------------------------------------------------------------------
1 | <%= message %>
2 | <%= error.status %>
3 | <%= error.stack %>
4 |
--------------------------------------------------------------------------------
/backend/views/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | <%= title %>
5 |
6 |
7 |
8 | <%= title %>
9 | Welcome to <%= title %>
10 |
11 |
12 |
--------------------------------------------------------------------------------