Example #1
0
    def g_callback(self):
        # parse the original url from the google+ redirect state param
        original_url = self.request.args.get('state', '')
        code = self.request.args['code']
        conf_ = conf['g']

        # authenticate the passed code
        q = requests.post(conf_['access_url'],
                          data = {'code': code,
                                 'client_id': conf_['client_id'], 'client_secret': conf_['client_secret'],
                                 'redirect_uri': oauth_base + '/callback/g',
                                 'grant_type': 'authorization_code'})

        if q.status_code != 200:
            stderr.write("Login error:\n    %s\n" % q.content)
            return self.redirect('/?msg=AUTH_ERROR')

        content = loads(q.content)
        access_token = content['access_token']
        del content

        # get userinfo
        q = requests.get('https://www.googleapis.com/oauth2/v1/userinfo?access_token=' + access_token)
        content = loads(q.content)

        profile_id = content['id']

        # save userinfo by id
        User.save_g_data(self.session, profile_id, fullname=content['name'], email=content['email'])

        # set redirect with cookie
        self.redirect('/' + original_url)
        cookie_val = prepare_cookie('gmail', str(profile_id))
        self._response.set_cookie('logged', cookie_val)
Example #2
0
    def fb_callback(self, original_url):
        if 'code' not in self.request.args:
            return self.redirect('/?msg=2')

        conf_ = conf['fb']
        code = self.request.args['code']
        callback_uri = oauth_base + conf_['callback_base'] + url_quote(original_url)
        callback = '/' + original_url

        q = requests.get('https://graph.facebook.com/oauth/access_token?' + \
                         url_encode({'client_id': conf_['consumer_key'],
                                     'redirect_uri': url_quote(callback_uri),
                                     'client_secret': conf_['consumer_secret'],
                                     'code': code}))

        if q.status_code != 200:
            return self.redirect('/?msg=2')

        content = url_decode(q.content)
        access_token = content['access_token']

        q = requests.get("https://graph.facebook.com/me?access_token=" + access_token)

        if q.status_code != 200:
            return self.redirect('/?msg=2')

        userdata = q.content
        userdata = loads(userdata)

        profile_id = userdata['id']

        # save userinfo by id
        User.save_fb_data(self.session, profile_id, userdata['name'], '')

        # set redirect with cookie
        self.redirect(callback)
        cookie_val = prepare_cookie('fb', str(profile_id))
        self._response.set_cookie('logged', cookie_val)
Example #3
0
class Controller(BaseController):

    def g_request(self, original_url):
        conf_ = conf['g']
        query_string = url_encode({'client_id': conf_['client_id'],
                                   'response_type': 'code',
                                   'scope': 'openid email profile',
                                   'redirect_uri': oauth_base + '/callback/g',
                                   'state': original_url,
                                   'access_type': 'online'})
        # redirects to 'login with google+' page
        self.redirect(conf_['token_url'] + '?' + query_string)

    def g_callback(self):
        # parse the original url from the google+ redirect state param
        original_url = self.request.args.get('state', '')
        code = self.request.args['code']
        conf_ = conf['g']

        # authenticate the passed code
        q = requests.post(conf_['access_url'],
                          data = {'code': code,
                                 'client_id': conf_['client_id'], 'client_secret': conf_['client_secret'],
                                 'redirect_uri': oauth_base + '/callback/g',
                                 'grant_type': 'authorization_code'})

        if q.status_code != 200:
            stderr.write("Login error:\n    %s\n" % q.content)
            return self.redirect('/?msg=AUTH_ERROR')

        content = loads(q.content)
        access_token = content['access_token']
        del content

        # get userinfo
        q = requests.get('https://www.googleapis.com/oauth2/v1/userinfo?access_token=' + access_token)
        content = loads(q.content)

        profile_id = content['id']

        # save userinfo by id
        User.save_g_data(self.session, profile_id, fullname=content['name'], email=content['email'])

        # set redirect with cookie
        self.redirect('/' + original_url)
        cookie_val = prepare_cookie('gmail', str(profile_id))
        self._response.set_cookie('logged', cookie_val)

    def logout(self, original_url):
        self.redirect('/' + original_url)
        self.response.delete_cookie('logged')


    def twitter_request(self, original_url):
        conf_ = conf['twitter']
        original_url = oauth_base + conf_['callback_base'] + url_quote(original_url)

        consumer = oauth2.Consumer(conf_['consumer_key'], conf_['consumer_secret'])
        client = oauth2.Client(consumer)

        q, content = client.request(conf_['token_url'], "POST",
                                    body = url_encode({'oauth_callback':original_url}))

        if q['status'] != "200":
            stderr.write("Login error twitter auth:\n    %s\n" % q.content)
            return self.redirect('/?msg=2')
        del q

        oauth_data = url_decode(content)
        oauth_token = oauth_data['oauth_token']
        oauth_token_secret = oauth_data['oauth_token_secret']

        del content
        del oauth_data

        f = open(oauth_secrets_path_prefix + oauth_token, 'w')
        f.write(oauth_token_secret)
        f.close()

        self.redirect(conf_['authenticate'] + "?oauth_token=" + oauth_token)

    def twitter_callback(self, original_url):
        oauth_token = self.request.args['oauth_token']

        try:
            f = open(oauth_secrets_path_prefix + oauth_token, 'r')
        except IOError, exc:
            stderr.write("Login error (token not found):\n    %s\n" % str(exc))
            return self.redirect('/?msg=2')

        oauth_token_secret = f.read()
        f.close()

        oauth_verifier = self.request.args['oauth_verifier']
        token = oauth2.Token(oauth_token, oauth_token_secret)
        token.set_verifier(oauth_verifier)

        conf_ = conf['twitter']
        consumer = oauth2.Consumer(conf_['consumer_key'], conf_['consumer_secret'])

        client = oauth2.Client(consumer, token)
        q, content = client.request(conf_['access_token'], method = 'POST')

        if q['status'] != "200":
            stderr.write("Login error:\n    %s\n" % q.content)
            return self.redirect('/?msg=2')

        del q
        content = url_decode(content)
        oauth_token = content['oauth_token']
        oauth_token_secret = content['oauth_token_secret']

        user_id = content['user_id']
        username = content['screen_name']
        User.save_twitter_data(self.session, user_id, fullname=username, email='')
        del content

        f = open(oauth_secrets_path_prefix + oauth_token, 'w')
        f.write(oauth_token_secret)
        f.close()

        # set redirect to callback
        original_url = '/' + original_url
        self.redirect(original_url)

        cookie_val = prepare_cookie('twitter', user_id)
        self._response.set_cookie('logged', cookie_val)