def google(self):
        access_token_url = 'https://accounts.google.com/o/oauth2/token'
        people_api_url = 'https://www.googleapis.com/plus/v1/people/me/openIdConnect'

        payload = dict(client_id=request.json['clientId'],
                       redirect_uri=request.json['redirectUri'],
                       client_secret=self._secrets.google_secret,
                       code=request.json['code'],
                       grant_type='authorization_code')

        # Step 1. Exchange authorization code for access token.
        r = requests.post(access_token_url, data=payload)
        token = json.loads(r.text)
        headers = {'Authorization': 'Bearer {0}'.format(token['access_token'])}

        # Step 2. Retrieve information about the current user.
        r = requests.get(people_api_url, headers=headers)
        profile = json.loads(r.text)

        maybe_user = self._user_repository.get_by_google_id(
            google_id=profile['sub'])
        if maybe_user.exists():
            user = maybe_user.values()[0]
            token = create_token(user)
            return jsonify(token=token)

        maybe_user_with_same_email = self._user_repository.get_by_email(
            email=profile['email'])  # Link accounts
        if maybe_user_with_same_email.exists():
            user = maybe_user_with_same_email.values()[0].copy_user()
            user_already_have_google_id = user.google is not None and str(
                user.google).strip() != ''
            if user_already_have_google_id:
                raise KeyError(
                    "user already exist for this email address with another facebook account"
                )
            user.google = profile['sub']
            if user.display_name is None:
                user.display_name = profile['name']
            if user.pic_link is None:
                user.pic_link = profile['picture']
            self._user_repository.update(user.id, user)
            token = create_token(user)
            return jsonify(token=token)

        u = User(facebook=profile['id'],
                 display_name=profile['name'],
                 email=profile['email'],
                 pic_link=profile['image'])
        self._user_repository.add(u)
        token = create_token(u)
        return jsonify(token=token)
 def signup(self):
     hashed_password = self._password_hasher.encode(
         request.json['password'])
     user = User(email=request.json['email'],
                 hashed_password=hashed_password,
                 display_name=request.json['displayName'])
     self._user_repository.add(user)
     token = create_token(user)
     return jsonify(token=token)
    def google(self):
        access_token_url = 'https://accounts.google.com/o/oauth2/token'
        people_api_url = 'https://www.googleapis.com/plus/v1/people/me/openIdConnect'

        payload = dict(client_id=request.json['clientId'],
                       redirect_uri=request.json['redirectUri'],
                       client_secret=self._secrets.google_secret,
                       code=request.json['code'],
                       grant_type='authorization_code')

        # Step 1. Exchange authorization code for access token.
        r = requests.post(access_token_url, data=payload)
        token = json.loads(r.text)
        headers = {'Authorization': 'Bearer {0}'.format(token['access_token'])}

        # Step 2. Retrieve information about the current user.
        r = requests.get(people_api_url, headers=headers)
        profile = json.loads(r.text)

        maybe_user = self._user_repository.get_by_google_id(google_id=profile['sub'])
        if maybe_user.exists():
            user = maybe_user.values()[0]
            token = create_token(user)
            return jsonify(token=token)

        maybe_user_with_same_email = self._user_repository.get_by_email(email=profile['email'])  # Link accounts
        if maybe_user_with_same_email.exists():
            user = maybe_user_with_same_email.values()[0].copy_user()
            user_already_have_google_id = user.google is not None and str(user.google).strip() != ''
            if user_already_have_google_id:
                raise KeyError("user already exist for this email address with another facebook account")
            user.google = profile['sub']
            if user.display_name is None:
                user.display_name = profile['name']
            if user.pic_link is None:
                user.pic_link = profile['picture']
            self._user_repository.update(user.id, user)
            token = create_token(user)
            return jsonify(token=token)

        u = User(facebook=profile['id'], display_name=profile['name'], email=profile['email'], pic_link=profile['image'])
        self._user_repository.add(u)
        token = create_token(u)
        return jsonify(token=token)
 def login(self):
     maybe_user = self._user_repository.get_by_email(email=request.json['email'])
     if maybe_user.exists():
         user = maybe_user.values()[0]
     if not maybe_user.exists() or not user.hashed_password or not self._password_hasher.verify(request.json['password'], user.hashed_password):
         response = jsonify(message='Wrong Email or Password')
         response.status_code = 401
         return response
     token = create_token(user)
     return jsonify(token=token)
 def login(self):
     maybe_user = self._user_repository.get_by_email(
         email=request.json['email'])
     if maybe_user.exists():
         user = maybe_user.values()[0]
     if not maybe_user.exists(
     ) or not user.hashed_password or not self._password_hasher.verify(
             request.json['password'], user.hashed_password):
         response = jsonify(message='Wrong Email or Password')
         response.status_code = 401
         return response
     token = create_token(user)
     return jsonify(token=token)
 def signup(self):
     hashed_password = self._password_hasher.encode(request.json['password'])
     user = User(email=request.json['email'], hashed_password=hashed_password, display_name=request.json['displayName'])
     self._user_repository.add(user)
     token = create_token(user)
     return jsonify(token=token)
    def facebook(self):
        if self._secrets.facebook_secret is None or str(self._secrets.facebook_secret).strip() == '':
            raise ValueError("facebook_secret")

        access_token_url = 'https://graph.facebook.com/v2.3/oauth/access_token'
        graph_api_url = 'https://graph.facebook.com/v2.3/me'

        params = {
            'client_id': request.json['clientId'],
            'redirect_uri': request.json['redirectUri'],
            'client_secret': self._secrets.facebook_secret,
            'code': request.json['code']
        }

        # Step 1. Exchange authorization code for access token.
        r = requests.get(access_token_url, params=params)
        access_token = json.loads(r.text)

        # Step 2. Retrieve information about the current user.
        r = requests.get(graph_api_url, params=access_token)
        profile = json.loads(r.text)

        # Step 3. (optional) Link accounts.
        if request.headers.get('Authorization'):
            maybe_user = self._user_repository.get_by_facebook_id(facebook_id=profile['id'])
            if maybe_user.exists():
                response = jsonify(message='There is already a Facebook account that belongs to you')
                response.status_code = 409
                return response

            payload = parse_token(request)

            maybe_user = self._user_repository.get_by_id(user_id=payload['sub'])
            if not maybe_user.exists():
                response = jsonify(message='User not found')
                response.status_code = 400
                return response

            user = maybe_user.values()[0]
            user.facebook = profile['id']
            user.display_name = profile['name']
            if user.email is None:
                user.email = profile['email']
            if user.pic_link is None:
                user.pic_link = self._create_facebook_pic_link(user.facebook)

            self._user_repository.update(user.id, user)
            token = create_token(user)
            return jsonify(token=token)

        # Step 4. Create a new account or return an existing one.
        maybe_user = self._user_repository.get_by_facebook_id(facebook_id=profile['id'])
        if maybe_user.exists():
            user = maybe_user.values()[0]
            token = create_token(user)
            return jsonify(token=token)

        maybe_user_with_same_email = self._user_repository.get_by_email(email=profile['email'])  # Link accounts
        if maybe_user_with_same_email.exists():
            user = maybe_user_with_same_email.values()[0].copy_user()
            user_already_have_facebook_id = user.facebook is not None and str(user.facebook).strip() != ''
            if user_already_have_facebook_id:
                raise KeyError("user already exist for this email address with another facebook account")
            user.facebook = profile['id']
            if user.display_name is None:
                user.display_name = profile['name']
            if user.pic_link is None:
                user.pic_link = self._create_facebook_pic_link(user.facebook)
            self._user_repository.update(user.id, user)
            token = create_token(user)
            return jsonify(token=token)

        pic_link = self._create_facebook_pic_link(profile['id'])
        u = User(facebook=profile['id'], display_name=profile['name'], email=profile['email'], pic_link=pic_link)
        self._user_repository.add(u)

        token = create_token(u)
        return jsonify(token=token)
    def facebook(self):
        if self._secrets.facebook_secret is None or str(
                self._secrets.facebook_secret).strip() == '':
            raise ValueError("facebook_secret")

        access_token_url = 'https://graph.facebook.com/v2.3/oauth/access_token'
        graph_api_url = 'https://graph.facebook.com/v2.3/me'

        params = {
            'client_id': request.json['clientId'],
            'redirect_uri': request.json['redirectUri'],
            'client_secret': self._secrets.facebook_secret,
            'code': request.json['code']
        }

        # Step 1. Exchange authorization code for access token.
        r = requests.get(access_token_url, params=params)
        access_token = json.loads(r.text)

        # Step 2. Retrieve information about the current user.
        r = requests.get(graph_api_url, params=access_token)
        profile = json.loads(r.text)

        # Step 3. (optional) Link accounts.
        if request.headers.get('Authorization'):
            maybe_user = self._user_repository.get_by_facebook_id(
                facebook_id=profile['id'])
            if maybe_user.exists():
                response = jsonify(
                    message=
                    'There is already a Facebook account that belongs to you')
                response.status_code = 409
                return response

            payload = parse_token(request)

            maybe_user = self._user_repository.get_by_id(
                user_id=payload['sub'])
            if not maybe_user.exists():
                response = jsonify(message='User not found')
                response.status_code = 400
                return response

            user = maybe_user.values()[0]
            user.facebook = profile['id']
            user.display_name = profile['name']
            if user.email is None:
                user.email = profile['email']
            if user.pic_link is None:
                user.pic_link = self._create_facebook_pic_link(user.facebook)

            self._user_repository.update(user.id, user)
            token = create_token(user)
            return jsonify(token=token)

        # Step 4. Create a new account or return an existing one.
        maybe_user = self._user_repository.get_by_facebook_id(
            facebook_id=profile['id'])
        if maybe_user.exists():
            user = maybe_user.values()[0]
            token = create_token(user)
            return jsonify(token=token)

        maybe_user_with_same_email = self._user_repository.get_by_email(
            email=profile['email'])  # Link accounts
        if maybe_user_with_same_email.exists():
            user = maybe_user_with_same_email.values()[0].copy_user()
            user_already_have_facebook_id = user.facebook is not None and str(
                user.facebook).strip() != ''
            if user_already_have_facebook_id:
                raise KeyError(
                    "user already exist for this email address with another facebook account"
                )
            user.facebook = profile['id']
            if user.display_name is None:
                user.display_name = profile['name']
            if user.pic_link is None:
                user.pic_link = self._create_facebook_pic_link(user.facebook)
            self._user_repository.update(user.id, user)
            token = create_token(user)
            return jsonify(token=token)

        pic_link = self._create_facebook_pic_link(profile['id'])
        u = User(facebook=profile['id'],
                 display_name=profile['name'],
                 email=profile['email'],
                 pic_link=pic_link)
        self._user_repository.add(u)

        token = create_token(u)
        return jsonify(token=token)