Example #1
0
def login(provider):
    # STEP 1 - Parse the auth code
    code = request.data

    if provider == 'google':
        # STEP 2 - Exchange for a token
        try:
            # Upgrade the authorization code into a credentials object
            oauth_flow = flow_from_clientsecrets('client_secrets.json',
                                                 scope='')
            oauth_flow.redirect_uri = 'postmessage'
            credentials = oauth_flow.step2_exchange(code)
        except FlowExchangeError:
            response = make_response(
                dumps('Failed to upgrade the authorization code.'), 401)
            response.headers['Content-Type'] = 'application/json'
            return response

        # Check that the access token is valid.
        access_token = credentials.access_token
        url = (
            'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=%s' %
            access_token)
        h = Http()
        result = loads(h.request(url, 'GET')[1])
        # If there was an error in the access token info, abort.
        if result.get('error') is not None:
            response = make_response(dumps(result.get('error')), 500)
            response.headers['Content-Type'] = 'application/json'

        # Get user info
        h = Http()
        userinfo_url = "https://www.googleapis.com/oauth2/v1/userinfo"
        params = {'access_token': credentials.access_token, 'alt': 'json'}
        answer = r_get(userinfo_url, params=params)

        data = answer.json()

        # see if user exists, if it doesn't make a new one
        user = get_user_by_email(email=data['email'])
        if not user:
            user = create_user(username=data.get('name'),
                               picture=data.get('picture'),
                               email=data.get('email'),
                               first_name=data.get('given_name'),
                               last_name=data.get('family_name'),
                               password=get_unique_str(8))

        g.user = user
        # Make token
        token = g.user.generate_auth_token()

        # Send back token to the client
        return jsonify({
            'token': token.decode('ascii'),
            'uid': g.user.id,
            'first_name': g.user.first_name,
            'last_name': g.user.last_name,
            'email': g.user.email,
            'picture': g.user.picture,
            'status': g.user.status,
            'full_name': g.user.get_full_name
        }), 200

    elif provider == 'facebook':

        data = request.json.get('data')
        access_token = data['access_token']
        fb_file = ''.join([BASE_DIR, '/facebook.json'])
        fb_data = loads(open(fb_file, 'r').read())['facebook']
        app_id = fb_data['app_id']
        app_secret = fb_data['app_secret']
        url = fb_data['access_token_url'] % (app_id, app_secret, access_token)
        h = Http()
        result = h.request(url, 'GET')[1]

        # Use token to get user info from API

        token = result.split(',')[0].split(':')[1].replace('"', '')
        url = fb_data['user_info_url'] % token

        h = Http()
        result = h.request(url, 'GET')[1]
        data = loads(result)
        name = data['name'].split(' ')

        user_data = dict()
        user_data['provider'] = 'facebook'
        user_data['username'] = data.get('name')
        user_data['first_name'] = name[0]
        user_data['last_name'] = name[1]
        user_data['email'] = data.get('email')
        user_data['facebook_id'] = data.get('id')
        user_data['access_token'] = token

        url = fb_data['picture_url'] % token
        h = Http()
        result = h.request(url, 'GET')[1]
        data = loads(result)
        user_data['picture'] = data['data']['url']
        # login_session['picture'] = data["data"]["url"]

        # see if user exists
        user_info = get_user_by_email(user_data['email'])

        if user_info is None:
            user_info = create_user(username=user_data['username'],
                                    password=get_unique_str(8),
                                    first_name=user_data['first_name'],
                                    last_name=user_data['last_name'],
                                    email=user_data['email'],
                                    picture=user_data['picture'])

        g.user = user_info
        token = g.user.generate_auth_token()
        return jsonify({
            'token': token.decode('ascii'),
            'uid': g.user.id,
            'first_name': g.user.first_name,
            'last_name': g.user.last_name,
            'email': g.user.email,
            'picture': g.user.picture,
            'status': g.user.status,
            'full_name': g.user.get_full_name
        }), 200

    else:
        return jsonify({'error': 'Unknown provider'}), 200
Example #2
0
def oauth(provider):
    """
    Authentication with providers

    :param provider:
    :return:
    """

    # STEP 1 - Parse the auth code
    code = request.data

    if provider == 'google':
        # STEP 2 - Exchange for a token
        try:
            # Upgrade the authorization code into a credentials object
            oauth_flow = flow_from_clientsecrets('client_secrets.json',
                                                 scope='')
            oauth_flow.redirect_uri = 'postmessage'
            credentials = oauth_flow.step2_exchange(code)
        except FlowExchangeError:
            response = make_response(
                dumps('Failed to upgrade the authorization code.'), 401)
            response.headers['Content-Type'] = 'application/json'
            return response

        # Check that the access token is valid.
        access_token = credentials.access_token

        # prepare url
        turl = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=%s'
        url = (turl % access_token)

        # get result
        h = Http()
        result = loads(h.request(url, 'GET')[1])

        # If there was an error in the access token info, abort.
        if result.get('error') is not None:
            response = make_response(dumps(result.get('error')), 500)
            response.headers['Content-Type'] = 'application/json'

        # Get user info
        h = Http()
        userinfo_url = "https://www.googleapis.com/oauth2/v1/userinfo"
        params = {'access_token': credentials.access_token, 'alt': 'json'}
        google_response = r_get(userinfo_url, params=params)

        data = google_response.json()

        # see if user exists, if it doesn't make a new one
        user = get_user_by_email(email=data['email'])
        if not user:
            user = create_user(username=data.get('name'),
                               picture=data.get('picture'),
                               email=data.get('email'),
                               first_name=data.get('given_name'),
                               last_name=data.get('family_name'),
                               password=get_unique_str(8))

        g.user = user

        # create session
        session['uid'] = user.id
        session['provider'] = 'google'

        return jsonify({'message': 'Success'}), 200

    elif provider == 'facebook':

        # get data
        data = request.json.get('data')

        # get access token
        access_token = data['access_token']

        # prepare path to app facebook data
        fb_file = ''.join([BASE_DIR, '/facebook.json'])

        # load data
        fb_data = loads(open(fb_file, 'r').read())['facebook']

        # gat app data
        app_id = fb_data['app_id']
        app_secret = fb_data['app_secret']

        # prepare query url for access token
        url = fb_data['access_token_url'] % (app_id, app_secret, access_token)

        # get result
        h = Http()
        result = h.request(url, 'GET')[1]

        # Use token to get user info from API
        token = result.split(',')[0].split(':')[1].replace('"', '')

        # prepare url for get user info
        url = fb_data['user_info_url'] % token

        # get result
        h = Http()
        result = h.request(url, 'GET')[1]

        # load data
        data = loads(result)

        # get first name and last name
        name = findall(r'[a-zA-Z]+', data['name'])

        # prepare dictionary for save
        user_data = dict()
        user_data['provider'] = 'facebook'
        user_data['username'] = ''.join(name)
        user_data['first_name'] = name[0]
        user_data['last_name'] = name[1]
        user_data['email'] = data.get('email')
        user_data['facebook_id'] = data.get('id')
        user_data['access_token'] = token

        # prepare url for get picture
        url = fb_data['picture_url'] % token

        # get result
        h = Http()
        result = h.request(url, 'GET')[1]

        # load data
        data = loads(result)

        # add picture link to dictionary
        user_data['picture'] = data['data']['url']

        # get user info
        user_info = get_user_by_email(user_data['email'])

        # check the user exist, if not create a new one
        if user_info is None:
            user_info = create_user(username=user_data['username'],
                                    password=get_unique_str(8),
                                    first_name=user_data['first_name'],
                                    last_name=user_data['last_name'],
                                    email=user_data['email'],
                                    picture=user_data['picture'])
        g.user = user_info

        # create session
        session['uid'] = user_info.id
        session['provider'] = 'facebook'
        return jsonify({'message': 'Success'}), 200

    else:
        return jsonify({'error': 'Unknown provider'})
Example #3
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy import create_engine
from passlib.apps import custom_app_context as pwd_context
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import BadSignature, SignatureExpired
from data_control import get_unique_str
from settings import *

Base = declarative_base()  # initialisation the database
secret_key = get_unique_str(32)  # create secret_key

# prepare engine
egg = 'postgresql://%s:%s@%s/%s' % (DB['user'],
                                    DB['password'],
                                    DB['host'],
                                    DB['database'])

# create session
engine = create_engine(egg)
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()


# TODO: User model
class User(Base):
Example #4
0
from oauth2client.client import flow_from_clientsecrets, FlowExchangeError
from bleach import clean
from httplib2 import Http
from flask import make_response
from requests import get as r_get
from json import dumps, loads
from re import findall

ALLOWED_EXTENSIONS = set(EXTENSIONS)
auth = HTTPBasicAuth()

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

brands = get_categories()
csrf_token = get_unique_str(32)


# TODO: Login required
def login_required(f):
    """
    Checking the user is logged in

    :param f:
    :return:
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if 'uid' in session:
            return f(*args, **kwargs)
        else: