Skip to content

Commit

Permalink
Fixes #1031 : Added Token service for validating request from frontend (
Browse files Browse the repository at this point in the history
  • Loading branch information
yashLadha authored and djmgit committed Jun 21, 2018
1 parent 7996e2b commit 79616d7
Show file tree
Hide file tree
Showing 20 changed files with 218 additions and 49 deletions.
35 changes: 13 additions & 22 deletions api/controllers/loginUser.py
Original file line number Diff line number Diff line change
@@ -1,48 +1,39 @@
import jwt
import datetime

from flask import Blueprint, jsonify, request
from flask import current_app as app
from api.utils.response import Response
from api.helpers.verifyPassword import verifyPassword
from api.models.user import User
from api.schemas.user import FTLUserSchema
from api.schemas.token import LoginTokenSchema
from api.utils.errors import ErrorResponse
from api.schemas.errors import (
JsonNotFound,
UserNotFound,
OperationNotFound,
PasswordNotFound
)


router = Blueprint('loginUser', __name__)


@router.route('/login', methods=['POST'])
@router.route('/login')
def login():
try:
data = request.get_json()
except Exception:
return ErrorResponse(JsonNotFound().message, 422, {'Content-Type': 'application/json'}).respond()

if 'name' in data.keys():
user = User.getUser(username=data['name'])
uid = data['uid']
args = request.args
if 'id' in args.keys():
user = User.getUser(user_id=args['id'])
uid = user.id
if not user:
return ErrorResponse(UserNotFound(uid).message, 422, {'Content-Type': 'application/json'}).respond()

if not verifyPassword(user, data['password']):
return ErrorResponse(PasswordNotFound().message, 422, {'Content-Type': 'application/json'}).respond()

# Token that is not expiring and validated for the whole session
token = jwt.encode(
{'user': user.username,
'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=900)},
{'user': user.username},
app.config.get('SECRET_KEY'))

return jsonify(
Response(200).generateToken(
token.decode('UTF-8')))
resp = {
'id': user.id,
'token': token.decode('UTF-8')}

return jsonify(LoginTokenSchema().dump(resp).data)

return ErrorResponse(OperationNotFound().message, 422, {'Content-Type': 'application/json'}).respond()

Expand Down
4 changes: 1 addition & 3 deletions api/controllers/oauthToken.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import datetime
import jwt


Expand All @@ -24,8 +23,7 @@ def oauth_token():

try:
token = jwt.encode(
{'user': data.get('username'),
'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=900)},
{'user': data.get('username')},
app.config.get('SECRET_KEY'))

except Exception:
Expand Down
9 changes: 9 additions & 0 deletions api/schemas/token.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,12 @@ class Meta:

id = fields.Str(required=True, dump_only=True)
valid = fields.Bool(required=True)


class LoginTokenSchema(Schema):
class Meta:
type_ = 'login-tokens'
kwargs = {'id': '<id>'}

id = fields.Str(required=True, dump_only=True)
token = fields.Str(required=True)
13 changes: 11 additions & 2 deletions frontend/app/adapters/badge.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
import ApplicationAdapter from './application';
import ENV from '../config/environment';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';


const { APP } = ENV;

export default ApplicationAdapter.extend({
host : APP.backLink,
pathForType : () => {
host : APP.backLink,
loginToken : service('auth-session'),
headers : computed('loginToken.authToken', function() {
return {
'x-access-token': this.get('loginToken.sessionToken')
};
}),
pathForType: () => {
return 'api/generate_badges';
}
});
13 changes: 11 additions & 2 deletions frontend/app/adapters/bg-color.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
import ApplicationAdapter from './application';
import ENV from '../config/environment';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';


const { APP } = ENV;

export default ApplicationAdapter.extend({
host : APP.backLink,
pathForType : () => {
host : APP.backLink,
loginToken : service('auth-session'),
headers : computed('loginToken.authToken', function() {
return {
'x-access-token': this.get('loginToken.sessionToken')
};
}),
pathForType: () => {
return 'api/upload/background_color';
}
});
12 changes: 10 additions & 2 deletions frontend/app/adapters/csv-file.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
import DS from 'ember-data';
import ENV from '../config/environment';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';

const { APP } = ENV;
const { RESTAdapter } = DS;

export default RESTAdapter.extend({
host : APP.backLink,
pathForType : () => {
host : APP.backLink,
loginToken : service('auth-session'),
headers : computed('loginToken.authToken', function() {
return {
'x-access-token': this.get('loginToken.sessionToken')
};
}),
pathForType: () => {
return 'api/upload/file';
}
});
13 changes: 11 additions & 2 deletions frontend/app/adapters/cust-img-file.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
import ApplicationAdapter from './application';
import ENV from '../config/environment';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';


const { APP } = ENV;

export default ApplicationAdapter.extend({
host : APP.backLink,
pathForType : () => {
host : APP.backLink,
loginToken : service('auth-session'),
headers : computed('loginToken.authToken', function() {
return {
'x-access-token': this.get('loginToken.sessionToken')
};
}),
pathForType: () => {
return 'api/upload/image';
}
});
13 changes: 11 additions & 2 deletions frontend/app/adapters/def-image-upload.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
import DS from 'ember-data';
import ENV from '../config/environment';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';


const { APP } = ENV;
const { JSONAPIAdapter } = DS;

export default JSONAPIAdapter.extend({
host : APP.backLink,
pathForType : () => {
host : APP.backLink,
loginToken : service('auth-session'),
headers : computed('loginToken.authToken', function() {
return {
'x-access-token': this.get('loginToken.sessionToken')
};
}),
pathForType: () => {
return 'api/upload/upload_default';
}
});
12 changes: 10 additions & 2 deletions frontend/app/adapters/def-image.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
import ApplicationAdapter from './application';
import ENV from '../config/environment';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';

const { APP } = ENV;

export default ApplicationAdapter.extend({
host : APP.backLink,
pathForType : () => {
host : APP.backLink,
loginToken : service('auth-session'),
headers : computed('loginToken.authToken', function() {
return {
'x-access-token': this.get('loginToken.sessionToken')
};
}),
pathForType: () => {
return 'api/default_images';
}
});
12 changes: 12 additions & 0 deletions frontend/app/adapters/login-token.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import DS from 'ember-data';
import ENV from '../config/environment';

const { JSONAPIAdapter } = DS;
const { APP } = ENV;

export default JSONAPIAdapter.extend({
host : APP.backLink,
pathForType : () => {
return 'user/login';
}
});
12 changes: 10 additions & 2 deletions frontend/app/adapters/my-badges.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
import ApplicationAdapter from './application';
import ENV from '../config/environment';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';

const { APP } = ENV;

export default ApplicationAdapter.extend({
host: APP.backLink,
host : APP.backLink,
loginToken : service('auth-session'),
headers : computed('loginToken.authToken', function() {
return {
'x-access-token': this.get('loginToken.sessionToken')
};
}),
pathForType() {
const user = this.get('session.currentUser');
return 'api/get_badges?uid=' + user.uid;
}
});
});
12 changes: 10 additions & 2 deletions frontend/app/adapters/profile-image.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
import DS from 'ember-data';
import ENV from '../config/environment';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';

const { JSONAPIAdapter } = DS;
const { APP } = ENV;

export default JSONAPIAdapter.extend({
host : APP.backLink,
pathForType : () => {
host : APP.backLink,
loginToken : service('auth-session'),
headers : computed('loginToken.authToken', function() {
return {
'x-access-token': this.get('loginToken.sessionToken')
};
}),
pathForType: () => {
return 'update/profileImage';
}
});
12 changes: 10 additions & 2 deletions frontend/app/adapters/text-data.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
import ApplicationAdapter from './application';
import ENV from '../config/environment';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';

const { APP } = ENV;

export default ApplicationAdapter.extend({
host : APP.backLink,
pathForType : () => {
host : APP.backLink,
loginToken : service('auth-session'),
headers : computed('loginToken.authToken', function() {
return {
'x-access-token': this.get('loginToken.sessionToken')
};
}),
pathForType: () => {
return 'api/upload/manual_data';
}
});
2 changes: 2 additions & 0 deletions frontend/app/adapters/valid-token.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import DS from 'ember-data';
import ENV from '../config/environment';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';

const { JSONAPIAdapter } = DS;
const { APP } = ENV;
Expand Down
26 changes: 20 additions & 6 deletions frontend/app/controllers/login.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ import Controller from '@ember/controller';
const { inject } = Ember;

export default Controller.extend({
session : inject.service(),
notify : inject.service('notify'),
session : inject.service(),
notify : inject.service('notify'),
authToken : inject.service('auth-session'),
beforeModel() {
return this.get('session').fetch().catch(function() {});
},
Expand Down Expand Up @@ -36,8 +37,7 @@ export default Controller.extend({
relationships: {}
}]
});
this_.transitionToRoute('/');
this_.get('notify').success('Log In Successful');
this_.send('generateLoginToken', userData.uid);
}).catch(function(err) {
console.log(err.message);
this_.get('notify').error('Log In Failed ! Please try again');
Expand All @@ -55,8 +55,7 @@ export default Controller.extend({
});
user_.save()
.then(obj => {
this_.transitionToRoute('/');
this_.get('notify').success('Log In Successful');
this_.send('generateLoginToken', obj.id);
})
.catch(err => {
console.log(err);
Expand All @@ -66,6 +65,21 @@ export default Controller.extend({
this_.get('notify').error('Log In Failed ! Please try again');
});
}
},

generateLoginToken(id) {
const this_ = this;
this.get('store').queryRecord('login-token', {
id
})
.then(record => {
this_.get('authToken').updateToken(record.token);
this_.transitionToRoute('/');
this_.get('notify').success('Log In Successful');
})
.catch(err => {
this_.get('notify').error('Unable to validate user');
});
}
}
});
7 changes: 7 additions & 0 deletions frontend/app/models/login-token.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import DS from 'ember-data';

const { Model, attr } = DS;

export default Model.extend({
token: attr('string')
});
Loading

0 comments on commit 79616d7

Please sign in to comment.