Package oauth2client :: Module old_run |
[hide private]
[frames] | no frames]

# Source Code for Module oauth2client.old_run

      1  # Copyright (C) 2013 Google Inc.
      2  #
      3  # Licensed under the Apache License, Version 2.0 (the "License");
      4  # you may not use this file except in compliance with the License.
      5  # You may obtain a copy of the License at
      6  #
      7  #      http://www.apache.org/licenses/LICENSE-2.0
      8  #
      9  # Unless required by applicable law or agreed to in writing, software
     10  # distributed under the License is distributed on an "AS IS" BASIS,
     11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12  # See the License for the specific language governing permissions and
     13  # limitations under the License.
     14
     15  """This module holds the old run() function which is deprecated, the
     16  tools.run_flow() function should be used in its place."""
     17
     18
     19  import logging
     20  import socket
     21  import sys
     22  import webbrowser
     23
     24  import gflags
     25
     26  from oauth2client import client
     27  from oauth2client import util
     28  from tools import ClientRedirectHandler
     29  from tools import ClientRedirectServer
     30
     31
     32  FLAGS = gflags.FLAGS
     33
     34  gflags.DEFINE_boolean('auth_local_webserver', True,
     35                        ('Run a local web server to handle redirects during '
     36                         'OAuth authorization.'))
     37
     38  gflags.DEFINE_string('auth_host_name', 'localhost',
     39                       ('Host name to use when running a local web server to '
     40                        'handle redirects during OAuth authorization.'))
     41
     42  gflags.DEFINE_multi_int('auth_host_port', [8080, 8090],
     43                          ('Port to use when running a local web server to '
     44                           'handle redirects during OAuth authorization.'))
     45
     46
     47  @util.positional(2)
     48 -def run(flow, storage, http=None):
     49    """Core code for a command-line application.
     50
     51    The run() function is called from your application and runs through all
     52    the steps to obtain credentials. It takes a Flow argument and attempts to
     53    open an authorization server page in the user's default web browser. The
     54    server asks the user to grant your application access to the user's data.
     55    If the user grants access, the run() function returns new credentials. The
     56    new credentials are also stored in the Storage argument, which updates the
     57    file associated with the Storage object.
     58
     59    It presumes it is run from a command-line application and supports the
     60    following flags:
     61
     62      --auth_host_name: Host name to use when running a local web server
     63        to handle redirects during OAuth authorization.
     64        (default: 'localhost')
     65
     66      --auth_host_port: Port to use when running a local web server to handle
     67      redirects during OAuth authorization.;
     68        repeat this option to specify a list of values
     69        (default: '[8080, 8090]')
     70        (an integer)
     71
     72      --[no]auth_local_webserver: Run a local web server to handle redirects
     73        during OAuth authorization.
     74        (default: 'true')
     75
     76    Since it uses flags make sure to initialize the gflags module before
     77    calling run().
     78
     79    Args:
     80      flow: Flow, an OAuth 2.0 Flow to step through.
     81      storage: Storage, a Storage to store the credential in.
     82      http: An instance of httplib2.Http.request
     83           or something that acts like it.
     84
     85    Returns:
     86      Credentials, the obtained credential.
     87    """
     88    logging.warning('This function, oauth2client.tools.run(), and the use of '
     89        'the gflags library are deprecated and will be removed in a future '
     90        'version of the library.')
     91    if FLAGS.auth_local_webserver:
     92      success = False
     93      port_number = 0
     94      for port in FLAGS.auth_host_port:
     95        port_number = port
     96        try:
     97          httpd = ClientRedirectServer((FLAGS.auth_host_name, port),
     98                                       ClientRedirectHandler)
     99        except socket.error, e:
    100          pass
    101        else:
    102          success = True
    103          break
    104      FLAGS.auth_local_webserver = success
    105      if not success:
    106        print 'Failed to start a local webserver listening on either port 8080'
    107        print 'or port 9090. Please check your firewall settings and locally'
    108        print 'running programs that may be blocking or using those ports.'
    109        print
    110        print 'Falling back to --noauth_local_webserver and continuing with',
    111        print 'authorization.'
    112        print
    113
    114    if FLAGS.auth_local_webserver:
    115      oauth_callback = 'http://%s:%s/' % (FLAGS.auth_host_name, port_number)
    116    else:
    117      oauth_callback = client.OOB_CALLBACK_URN
    118    flow.redirect_uri = oauth_callback
    119    authorize_url = flow.step1_get_authorize_url()
    120
    121    if FLAGS.auth_local_webserver:
    122      webbrowser.open(authorize_url, new=1, autoraise=True)
    123      print 'Your browser has been opened to visit:'
    124      print
    125      print '    ' + authorize_url
    126      print
    127      print 'If your browser is on a different machine then exit and re-run'
    128      print 'this application with the command-line parameter '
    129      print
    130      print '  --noauth_local_webserver'
    131      print
    132    else:
    133      print 'Go to the following link in your browser:'
    134      print
    135      print '    ' + authorize_url
    136      print
    137
    138    code = None
    139    if FLAGS.auth_local_webserver:
    140      httpd.handle_request()
    141      if 'error' in httpd.query_params:
    142        sys.exit('Authentication request was rejected.')
    143      if 'code' in httpd.query_params:
    144        code = httpd.query_params['code']
    145      else:
    146        print 'Failed to find "code" in the query parameters of the redirect.'
    147        sys.exit('Try running with --noauth_local_webserver.')
    148    else:
    149      code = raw_input('Enter verification code: ').strip()
    150
    151    try:
    152      credential = flow.step2_exchange(code, http=http)
    153    except client.FlowExchangeError, e:
    154      sys.exit('Authentication has failed: %s' % e)
    155
    156    storage.put(credential)
    157    credential.set_store(storage)
    158    print 'Authentication successful.'
    159
    160    return credential
    161