|
@@ -0,0 +1,109 @@
|
|
|
+import requests
|
|
|
+import urllib
|
|
|
+import simplejson as json
|
|
|
+import random
|
|
|
+import string
|
|
|
+
|
|
|
+
|
|
|
+AUTHORISE_URL = 'https://accounts.google.com/o/oauth2/auth'
|
|
|
+ACCESS_TOKEN_URL = 'https://accounts.google.com/o/oauth2/token'
|
|
|
+REDIRECT_URL = 'http://localhost:8000/hackathon/'
|
|
|
+PROFILE_API = 'https://www.googleapis.com/auth/plus.login'
|
|
|
+
|
|
|
+class GooglePlus:
|
|
|
+
|
|
|
+ access_token = None
|
|
|
+ session_id = None
|
|
|
+
|
|
|
+ def __init__(self, client_id, client_secret):
|
|
|
+ '''
|
|
|
+ Parameters:
|
|
|
+ client_id: string
|
|
|
+ - The client ID from the registering app on Google.
|
|
|
+
|
|
|
+ client_secret: string
|
|
|
+ -The client secret from the registering app on Google.
|
|
|
+ '''
|
|
|
+ self.client_id = client_id
|
|
|
+ self.client_secret = client_secret
|
|
|
+
|
|
|
+
|
|
|
+ def get_session_id(self, length=50):
|
|
|
+ '''
|
|
|
+ Generates a random session ID. As a part from the authentication process
|
|
|
+ we need to verify that the response we get from the server contains the
|
|
|
+ same session ID as we sent.
|
|
|
+
|
|
|
+ Parameters:
|
|
|
+ length: integer
|
|
|
+ - The length of the session ID.
|
|
|
+ '''
|
|
|
+ chars = string.uppercase + string.digits + string.lowercase
|
|
|
+ self.session_id = ''.join(random.choice(chars) for _ in range(length))
|
|
|
+
|
|
|
+
|
|
|
+ def get_authorize_url(self):
|
|
|
+ '''
|
|
|
+ Obtains authorize url link with the given client_id.
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ authURL: string
|
|
|
+ - The authorization URL.
|
|
|
+ '''
|
|
|
+
|
|
|
+ self.get_session_id()
|
|
|
+ authSettings = {'state': self.session_id,
|
|
|
+ 'redirect_uri':REDIRECT_URL,
|
|
|
+ 'response_type':'code',
|
|
|
+ 'client_id':self.client_id,
|
|
|
+ 'scope': PROFILE_API}
|
|
|
+
|
|
|
+ params = urllib.urlencode(authSettings)
|
|
|
+ return AUTHORISE_URL + '?' + params
|
|
|
+
|
|
|
+
|
|
|
+ def get_access_token(self, code, state):
|
|
|
+ '''
|
|
|
+ Obtains access token.
|
|
|
+
|
|
|
+ Parameters:
|
|
|
+ code: string
|
|
|
+ - The code is retrived from the authorization URL parameter
|
|
|
+ to obtain access token.
|
|
|
+ state: string
|
|
|
+ - The unique session ID.
|
|
|
+ '''
|
|
|
+
|
|
|
+ #Checking that the sessino ID from the response match the session ID we sent
|
|
|
+ if state != self.session_id:
|
|
|
+ raise(Exception('Danger! Someone is messing up with you connection!'))
|
|
|
+
|
|
|
+ authSettings = {'client_secret': self.client_secret,
|
|
|
+ 'code':code,
|
|
|
+ 'grant_type':'authorization_code',
|
|
|
+ 'client_id': self.client_id,
|
|
|
+ 'redirect_uri': 'http://localhost:8000/hackathon/'}
|
|
|
+
|
|
|
+ response = requests.post(ACCESS_TOKEN_URL, data=authSettings)
|
|
|
+ if response.status_code != 200:
|
|
|
+ raise(Exception('Invalid response, response code {c}'.format(c=response.status_code)))
|
|
|
+
|
|
|
+ self.access_token = response.json()['access_token']
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ def get_user_info(self):
|
|
|
+ '''
|
|
|
+ Obtain user information.
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ content: dictionary
|
|
|
+ - A dictionary contains user information.
|
|
|
+ '''
|
|
|
+ USER_INFO_API = 'https://www.googleapis.com/oauth2/v2/userinfo'
|
|
|
+ params = urllib.urlencode({'access_token' : self.access_token})
|
|
|
+ response = requests.get(USER_INFO_API + '?' + params)
|
|
|
+ if response.status_code != 200:
|
|
|
+ raise(Exception('Invalid response, response code {c}'.format(c=response.status_code)))
|
|
|
+
|
|
|
+ return response.json()
|