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())