import ee import errno import json import os import urllib import urllib2 from IPython.display import HTML from IPython.display import display from ee.oauthinfo import OAuthInfo # This URI prompts user to copy and paste a code after successful # authorization. ee_redirect_uri = 'urn:ietf:wg:oauth:2.0:oob' def create_auth_url(): # TODO(user): Add an additional, non-commandline flow for iPython notebook # for added convenience, and to work in notebook environments where # commandline isn't available. # This implements the flow from: # https://developers.google.com/accounts/docs/OAuth2ForDevices ### Request authorization from user auth_request_params = { 'scope': OAuthInfo.SCOPE, 'redirect_uri': ee_redirect_uri, 'response_type': 'code', 'client_id': OAuthInfo.CLIENT_ID } auth_request_url = ('https://accounts.google.com/o/oauth2/auth?' + urllib.urlencode(auth_request_params)) return auth_request_url def ee_authenticate(auth_code): token_request_params = { 'code': auth_code, 'client_id': OAuthInfo.CLIENT_ID, 'client_secret': OAuthInfo.CLIENT_SECRET, 'redirect_uri': ee_redirect_uri, 'grant_type': 'authorization_code' } refresh_token = None try: response = urllib2.urlopen('https://accounts.google.com/o/oauth2/token', urllib.urlencode(token_request_params)).read() tokens = json.loads(response) refresh_token = tokens['refresh_token'] except urllib2.HTTPError, e: raise Exception('Problem requesting tokens. Please try again. %s %s' % (e, e.read())) ### Write refresh token to filesystem for later use credentials_path = OAuthInfo.credentials_path() dirname = os.path.dirname(credentials_path) try: os.makedirs(dirname) except OSError, e: if e.errno != errno.EEXIST: raise Exception('Error creating %s: %s' % (dirname, e)) json.dump({'refresh_token': refresh_token}, open(credentials_path, 'w')) print '\nSuccessfully saved authorization to %s' % credentials_path ee.Initialize() return True def auth_html(): return HTML( ("""You need to authorize access to your Earth Engine account.
Please follow this link, """ % create_auth_url()) + """and paste the token you receive after authorization here: """) # For now, call ee_initialize() instead of ee.Initialize() def ee_initialize(): try: ee.Initialize() display(HTML("""Authentication successful!""")) except ee.EEException, e: display(auth_html())