6 from forum.settings import APP_URL
7 from forum.authentication.base import AuthenticationConsumer, InvalidAuthentication
8 from django.utils.translation import ugettext as _
9 from django.core.urlresolvers import reverse
11 from settings import TWITTER_AUTO_CALLBACK_REDIRECT
12 from lib import oauth2
14 class OAuthAbstractAuthConsumer(AuthenticationConsumer):
16 def __init__(self, consumer_key, consumer_secret, server_url, request_token_url, access_token_url, authorization_url):
17 self.consumer_secret = consumer_secret
18 self.consumer_key = consumer_key
20 self.consumer = oauth2.Consumer(consumer_key, consumer_secret)
21 self.signature_method = oauth2.SignatureMethod_HMAC_SHA1()
23 self.server_url = server_url
24 self.request_token_url = request_token_url
25 self.access_token_url = access_token_url
26 self.authorization_url = authorization_url
28 def prepare_authentication_request(self, request, redirect_to):
29 request_token = self.fetch_request_token()
30 request.session['unauthed_token'] = request_token.to_string()
31 return self.authorize_token_url(request_token)
33 def process_authentication_request(self, request):
34 unauthed_token = request.session.get('unauthed_token', None)
35 if not unauthed_token:
36 raise InvalidAuthentication(_('Error, the oauth token is not on the server'))
38 token = oauth2.Token.from_string(unauthed_token)
40 if token.key != request.GET.get('oauth_token', 'no-token'):
41 raise InvalidAuthentication(_("Something went wrong! Auth tokens do not match"))
43 access_token = self.fetch_access_token(token, request.GET.get('oauth_verifier', ''))
45 return access_token.to_string()
47 def get_user_data(self, key):
48 #token = oauth.OAuthToken.from_string(access_token)
51 def fetch_request_token(self):
53 # If the installation is configured to automatically redirect to the Twitter provider done page -- do it.
54 if bool(TWITTER_AUTO_CALLBACK_REDIRECT):
55 callback_url = '%s%s' % (APP_URL, reverse('auth_provider_done', prefix='/', kwargs={'provider' : 'twitter'}))
58 'oauth_callback' : callback_url,
61 oauth_request = oauth2.Request.from_consumer_and_token(self.consumer, http_url=self.request_token_url, parameters=parameters)
62 oauth_request.sign_request(self.signature_method, self.consumer, None)
63 params = oauth_request
64 data = urllib.urlencode(params)
65 full_url='%s?%s'%(self.request_token_url, data)
66 response = urllib2.urlopen(full_url)
67 return oauth2.Token.from_string(response.read())
69 def authorize_token_url(self, token, callback_url=None):
70 oauth_request = oauth2.Request.from_token_and_callback(token=token,\
71 callback=callback_url, http_url=self.authorization_url)
72 params = oauth_request
73 data = urllib.urlencode(params)
74 full_url='%s?%s'%(self.authorization_url, data)
77 def fetch_access_token(self, token, oauth_verifier):
78 oauth_request = oauth2.Request.from_consumer_and_token(self.consumer, token=token, http_url=self.access_token_url)
79 oauth_request['oauth_verifier'] = oauth_verifier
80 oauth_request.sign_request(self.signature_method, self.consumer, token)
81 params = oauth_request
82 data = urllib.urlencode(params)
83 full_url='%s?%s'%(self.access_token_url, data)
84 response = urllib2.urlopen(full_url)
85 return oauth2.Token.from_string(response.read())
87 def fetch_data(self, token, http_url, parameters=None):
88 access_token = oauth2.Token.from_string(token)
89 oauth_request = oauth2.Request.from_consumer_and_token(
90 self.consumer, token=access_token, http_method="GET",
91 http_url=http_url, parameters=parameters,
93 oauth_request.sign_request(self.signature_method, self.consumer, access_token)
95 url = oauth_request.to_url()
96 connection = httplib.HTTPSConnection(self.server_url)
97 connection.request("GET", url)
99 return connection.getresponse().read()