Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2013
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.07 KB | None | 0 0
  1. #oauth.py
  2.  
  3. # Based on a modified version of oauth.py from the py-gaugette library.
  4. #   https://github.com/guyc/py-gaugette/blob/master/gaugette/oauth.py
  5. #   http://guy.carpenter.id.au/gaugette/blog/2012/11/06/using-google-oauth2-for-devices/
  6. # For more info on oauth for devices, see:
  7. #   https://developers.google.com/accounts/docs/OAuth2ForDevices
  8.  
  9.  
  10. import sys
  11. import urllib
  12. import httplib
  13. import os.path
  14. import json
  15. import time
  16. #import gdata.spreadsheet.service
  17.  
  18. class OAuth:
  19.   def __init__(self, client_id, client_secret):
  20.     self.client_id = client_id
  21.     self.client_secret = client_secret
  22.     self.token = None
  23.     self.device_code = None
  24.     self.verfication_url = None
  25.     self.token_file = 'oauth_token.json'
  26.     self.scope = [
  27.       'https://www.googleapis.com/auth/userinfo.profile',
  28.     ]
  29.     self.host = 'accounts.google.com'
  30.     # httplib.HTTPConnection.debuglevel = 1
  31.     self.conn = httplib.HTTPSConnection(self.host)
  32.     self.load_token()
  33.  
  34.   def load_token(self):
  35.     token = None
  36.     if os.path.isfile(self.token_file):
  37.       f = open(self.token_file)
  38.       json_token = f.read()
  39.       self.token = json.loads(json_token)
  40.       f.close()
  41.  
  42.   def save_token(self):
  43.     f = open(self.token_file, 'w')
  44.     f.write(json.dumps(self.token))
  45.     f.close()
  46.  
  47.   def has_token(self):
  48.     return self.token != None
  49.  
  50.   def get_user_code(self):
  51.     self.conn.request(
  52.       "POST",
  53.       "/o/oauth2/device/code",
  54.       urllib.urlencode({
  55.         'client_id': self.client_id,
  56.         'scope' : ' '.join(self.scope)
  57.         }),
  58.       {"Content-type": "application/x-www-form-urlencoded"}
  59.       )
  60.     response = self.conn.getresponse()
  61.     if (response.status == 200):
  62.       data = json.loads(response.read())
  63.       self.device_code = data['device_code']
  64.       self.user_code = data['user_code']
  65.       self.verification_url = data['verification_url']
  66.       self.retry_interval = data['interval']
  67.     else:
  68.       print response.status
  69.       print response.read()
  70.       sys.exit()
  71.     return self.user_code
  72.  
  73.   def get_new_token(self):
  74.     # call get_device_code if not already set
  75.     if not self.user_code:
  76.       self.get_user_code()
  77.      
  78.     while self.token == None:
  79.       self.conn.request(
  80.         "POST",
  81.         "/o/oauth2/token",
  82.         urllib.urlencode({
  83.           'client_id' : self.client_id,
  84.           'client_secret' : self.client_secret,
  85.           'code' : self.device_code,
  86.           'grant_type' : 'http://oauth.net/grant_type/device/1.0'
  87.           }),
  88.         {"Content-type": "application/x-www-form-urlencoded"}
  89.         )
  90.  
  91.       response = self.conn.getresponse()
  92.       if (response.status == 200):
  93.         data = json.loads(response.read())
  94.         # print data
  95.         if 'access_token' in data:
  96.           self.token = data
  97.           self.save_token()
  98.         else:
  99.           time.sleep(self.retry_interval + 2)
  100.  
  101.   def refresh_token(self):
  102.     refresh_token = self.token['refresh_token']
  103.     self.conn.request(
  104.       "POST",
  105.       "/o/oauth2/token",
  106.       urllib.urlencode({
  107.         'client_id' : self.client_id,
  108.         'client_secret' : self.client_secret,
  109.         'refresh_token' : refresh_token,
  110.         'grant_type' : 'refresh_token'
  111.         }),
  112.       {"Content-type": "application/x-www-form-urlencoded"}
  113.       )
  114.  
  115.     response = self.conn.getresponse()
  116.     if (response.status == 200):
  117.       data = json.loads(response.read())
  118.       if 'access_token' in data:
  119.         self.token = data
  120.         # in fact we NEVER get a new refresh token at this point
  121.         if not 'refresh_token' in self.token:
  122.           self.token['refresh_token'] = refresh_token
  123.           self.save_token()
  124.         return True
  125.     else:
  126.       print("Unexpected response %d to renewal request" % response.status)
  127.       print(response.read())
  128.     return False
  129.  
  130.   '''        
  131.  def spreadsheet_service(self):
  132.    headers = {
  133.      "Authorization": "%s %s" % (self.token['token_type'], self.token['access_token'])
  134.    }
  135.    client = gdata.spreadsheet.service.SpreadsheetsService(additional_headers=headers)
  136.    return client
  137.  '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement