earthengine-api/python/ee/authenticate.py
Igor Nazarenko f89e198b16 v0.1.38
2014-09-25 14:58:39 -07:00

88 lines
2.5 KiB
Python

#!/usr/bin/env python
"""Script to prompt user to authorize OAuth2 access to Earth Engine account.
Stores credentials (refresh token) for later use
"""
import errno
import json
import os
import urllib
import urllib2
import webbrowser
from oauthinfo import OAuthInfo
def main():
# 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
# This URI prompts user to copy and paste a code after successful
# authorization.
redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
auth_request_params = {
'scope': OAuthInfo.SCOPE,
'redirect_uri': 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))
webbrowser.open_new(auth_request_url)
print """
Opening web browser to address %s
Please authorize access to your Earth Engine account, and paste
the resulting code below.
If the web browser does not start, please manually browse the the URL above.
""" % auth_request_url
auth_code = raw_input('Please enter authorization code: ').strip()
### Use authorization code to request tokens
token_request_params = {
'code': auth_code,
'client_id': OAuthInfo.CLIENT_ID,
'client_secret': OAuthInfo.CLIENT_SECRET,
'redirect_uri': 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
if __name__ == '__main__':
main()