Skip to content
Snippets Groups Projects
Commit 281c4e41 authored by Ben Adida's avatar Ben Adida
Browse files

tweaked oauth login to be multi-server capable, added linked auth

parent 96ebf1b5
No related branches found
No related tags found
No related merge requests found
AUTH_SYSTEMS = {} AUTH_SYSTEMS = {}
import twitter, password, cas, facebook, google, yahoo import twitter, password, cas, facebook, google, yahoo, linkedin
AUTH_SYSTEMS['twitter'] = twitter AUTH_SYSTEMS['twitter'] = twitter
AUTH_SYSTEMS['linkedin'] = linkedin
AUTH_SYSTEMS['password'] = password AUTH_SYSTEMS['password'] = password
AUTH_SYSTEMS['cas'] = cas AUTH_SYSTEMS['cas'] = cas
AUTH_SYSTEMS['facebook'] = facebook AUTH_SYSTEMS['facebook'] = facebook
......
"""
LinkedIn Authentication
"""
from oauthclient import client
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from auth import utils
from xml.etree import ElementTree
import logging
from django.conf import settings
API_KEY = settings.LINKEDIN_API_KEY
API_SECRET = settings.LINKEDIN_API_SECRET
# some parameters to indicate that status updating is possible
STATUS_UPDATES = False
STATUS_UPDATE_WORDING_TEMPLATE = "Tweet %s"
OAUTH_PARAMS = {
'root_url' : 'https://api.linkedin.com/uas',
'request_token_path' : '/oauth/requestToken',
'authorize_path' : '/oauth/authorize',
'authenticate_path' : '/oauth/authenticate',
'access_token_path': '/oauth/accessToken'
}
def _get_new_client(token=None, token_secret=None):
if token:
return client.LoginOAuthClient(API_KEY, API_SECRET, OAUTH_PARAMS, token, token_secret)
else:
return client.LoginOAuthClient(API_KEY, API_SECRET, OAUTH_PARAMS)
def _get_client_by_token(token):
return _get_new_client(token['oauth_token'], token['oauth_token_secret'])
def get_auth_url(request, redirect_url):
client = _get_new_client()
try:
tok = client.get_request_token()
except:
return None
request.session['request_token'] = tok
url = client.get_authenticate_url(tok['oauth_token'])
return url
def get_user_info_after_auth(request):
tok = request.session['request_token']
login_client = _get_client_by_token(tok)
access_token = login_client.get_access_token(verifier = request.GET.get('oauth_verifier', None))
request.session['access_token'] = access_token
user_info_xml = ElementTree.fromstring(login_client.oauth_request('http://api.linkedin.com/v1/people/~:(id,first-name,last-name)', args={}, method='GET'))
user_id = user_info_xml.findtext('id')
first_name = user_info_xml.findtext('first-name')
last_name = user_info_xml.findtext('last-name')
return {'type': 'linkedin', 'user_id' : user_id, 'name': "%s %s" % (first_name, last_name), 'info': {}, 'token': access_token}
def user_needs_intervention(user_id, user_info, token):
"""
check to see if user is following the users we need
"""
return None
def _get_client_by_request(request):
access_token = request.session['access_token']
return _get_client_by_token(access_token)
def update_status(user_id, user_info, token, message):
"""
post a message to the auth system's update stream, e.g. twitter stream
"""
return
#twitter_client = _get_client_by_token(token)
#result = twitter_client.oauth_request('http://api.twitter.com/1/statuses/update.json', args={'status': message}, method='POST')
def send_message(user_id, user_name, user_info, subject, body):
pass
def send_notification(user_id, user_info, message):
pass
''' '''
Python Oauth client for Twitter Python Oauth client for Twitter
modified to work with other oAuth logins like LinkedIn (Ben Adida)
Used the SampleClient from the OAUTH.org example python client as basis. Used the SampleClient from the OAUTH.org example python client as basis.
...@@ -13,22 +14,26 @@ import webbrowser ...@@ -13,22 +14,26 @@ import webbrowser
import oauth as oauth import oauth as oauth
from urlparse import urlparse from urlparse import urlparse
class TwitterOAuthClient(oauth.OAuthClient): class LoginOAuthClient(oauth.OAuthClient):
api_root_url = 'https://twitter.com' #for testing 'http://term.ie'
api_root_port = "80"
#set api urls #set api urls
def request_token_url(self): def request_token_url(self):
return self.api_root_url + '/oauth/request_token' return self.server_params['root_url'] + self.server_params['request_token_path']
def authorize_url(self): def authorize_url(self):
return self.api_root_url + '/oauth/authorize' return self.server_params['root_url'] + self.server_params['authorize_path']
def authenticate_url(self): def authenticate_url(self):
return self.api_root_url + '/oauth/authenticate' return self.server_params['root_url'] + self.server_params['authenticate_path']
def access_token_url(self): def access_token_url(self):
return self.api_root_url + '/oauth/access_token' return self.server_params['root_url'] + self.server_params['access_token_path']
#oauth object #oauth object
def __init__(self, consumer_key, consumer_secret, oauth_token=None, oauth_token_secret=None): def __init__(self, consumer_key, consumer_secret, server_params, oauth_token=None, oauth_token_secret=None):
"""
params should be a dictionary including
root_url, request_token_path, authorize_path, authenticate_path, access_token_path
"""
self.server_params = server_params
self.sha1_method = oauth.OAuthSignatureMethod_HMAC_SHA1() self.sha1_method = oauth.OAuthSignatureMethod_HMAC_SHA1()
self.consumer = oauth.OAuthConsumer(consumer_key, consumer_secret) self.consumer = oauth.OAuthConsumer(consumer_key, consumer_secret)
if ((oauth_token != None) and (oauth_token_secret!=None)): if ((oauth_token != None) and (oauth_token_secret!=None)):
...@@ -97,7 +102,10 @@ class TwitterOAuthClient(oauth.OAuthClient): ...@@ -97,7 +102,10 @@ class TwitterOAuthClient(oauth.OAuthClient):
def get_authenticate_url(self, token): def get_authenticate_url(self, token):
return self.authenticate_url() + '?oauth_token=' +token return self.authenticate_url() + '?oauth_token=' +token
def get_access_token(self,token=None): def get_access_token(self,token=None,verifier=None):
if verifier:
r = self.oauth_request(self.access_token_url(), args={'oauth_verifier': verifier})
else:
r = self.oauth_request(self.access_token_url()) r = self.oauth_request(self.access_token_url())
token = self.oauth_parse_response(r) token = self.oauth_parse_response(r)
self.token = oauth.OAuthConsumer(token['oauth_token'],token['oauth_token_secret']) self.token = oauth.OAuthConsumer(token['oauth_token'],token['oauth_token_secret'])
...@@ -117,6 +125,9 @@ class TwitterOAuthClient(oauth.OAuthClient): ...@@ -117,6 +125,9 @@ class TwitterOAuthClient(oauth.OAuthClient):
return self.http_wrapper(req.get_normalized_http_url(),req.to_postdata()) return self.http_wrapper(req.get_normalized_http_url(),req.to_postdata())
##
## the code below needs to be updated to take into account not just Twitter
##
if __name__ == '__main__': if __name__ == '__main__':
consumer_key = '' consumer_key = ''
...@@ -125,7 +136,7 @@ if __name__ == '__main__': ...@@ -125,7 +136,7 @@ if __name__ == '__main__':
consumer_key = raw_input('Please enter consumer key: ') consumer_key = raw_input('Please enter consumer key: ')
while not consumer_secret: while not consumer_secret:
consumer_secret = raw_input('Please enter consumer secret: ') consumer_secret = raw_input('Please enter consumer secret: ')
auth_client = TwitterOAuthClient(consumer_key,consumer_secret) auth_client = LoginOAuthClient(consumer_key,consumer_secret)
tok = auth_client.get_request_token() tok = auth_client.get_request_token()
token = tok['oauth_token'] token = tok['oauth_token']
token_secret = tok['oauth_token_secret'] token_secret = tok['oauth_token_secret']
...@@ -133,7 +144,7 @@ if __name__ == '__main__': ...@@ -133,7 +144,7 @@ if __name__ == '__main__':
webbrowser.open(url) webbrowser.open(url)
print "Visit this URL to authorize your app: " + url print "Visit this URL to authorize your app: " + url
response_token = raw_input('What is the oauth_token from twitter: ') response_token = raw_input('What is the oauth_token from twitter: ')
response_client = TwitterOAuthClient(consumer_key, consumer_secret,token, token_secret) response_client = LoginOAuthClient(consumer_key, consumer_secret,token, token_secret, server_params={})
tok = response_client.get_access_token() tok = response_client.get_access_token()
print "Making signed request" print "Making signed request"
#verify user access #verify user access
......
...@@ -22,11 +22,19 @@ DM_TOKEN = settings.TWITTER_DM_TOKEN ...@@ -22,11 +22,19 @@ DM_TOKEN = settings.TWITTER_DM_TOKEN
STATUS_UPDATES = True STATUS_UPDATES = True
STATUS_UPDATE_WORDING_TEMPLATE = "Tweet %s" STATUS_UPDATE_WORDING_TEMPLATE = "Tweet %s"
OAUTH_PARAMS = {
'root_url' : 'https://twitter.com',
'request_token_path' : '/oauth/request_token',
'authorize_path' : '/oauth/authorize',
'authenticate_path' : '/oauth/authenticate',
'access_token_path': '/oauth/access_token'
}
def _get_new_client(token=None, token_secret=None): def _get_new_client(token=None, token_secret=None):
if token: if token:
return client.TwitterOAuthClient(API_KEY, API_SECRET, token, token_secret) return client.LoginOAuthClient(API_KEY, API_SECRET, OAUTH_PARAMS, token, token_secret)
else: else:
return client.TwitterOAuthClient(API_KEY, API_SECRET) return client.LoginOAuthClient(API_KEY, API_SECRET, OAUTH_PARAMS)
def _get_client_by_token(token): def _get_client_by_token(token):
return _get_new_client(token['oauth_token'], token['oauth_token_secret']) return _get_new_client(token['oauth_token'], token['oauth_token_secret'])
......
auth/media/login-icons/linkedin.png

19.8 KiB

...@@ -153,6 +153,10 @@ TWITTER_REASON_TO_FOLLOW = "we can direct-message you when the result has been c ...@@ -153,6 +153,10 @@ TWITTER_REASON_TO_FOLLOW = "we can direct-message you when the result has been c
# the token for Helios to do direct messaging # the token for Helios to do direct messaging
TWITTER_DM_TOKEN = {"oauth_token": "", "oauth_token_secret": "", "user_id": "", "screen_name": ""} TWITTER_DM_TOKEN = {"oauth_token": "", "oauth_token_secret": "", "user_id": "", "screen_name": ""}
# LinkedIn
LINKEDIN_API_KEY = ''
LINKEDIN_API_SECRET = ''
# email server # email server
EMAIL_HOST = 'localhost' EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025 EMAIL_PORT = 1025
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment