Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add basic user guide #79

Merged
merged 2 commits into from
Nov 10, 2016
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 52 additions & 13 deletions docs/index.rst
Original file line number Diff line number Diff line change
@@ -1,22 +1,61 @@
Welcome to ``google-auth``'s documentation!
===========================================

Contents:
google-auth
===========

.. toctree::
:hidden:
:maxdepth: 2

reference/modules
user-guide
Reference <reference/modules>

``google-auth`` is the Google authentication library for Python. This library
provides the ability to authenticate to Google APIs using various methods. It
also provides integration with several HTTP libraries.

- Support for Google :func:`Application Default Credentials <google.auth.default>`.
- Support for signing and verifying :mod:`JWTs <google.auth.jwt>`.
- Support for Google :mod:`Service Account credentials <google.oauth2.service_account>`.
- Support for :mod:`Google Compute Engine credentials <google.auth.compute_engine>`.
- Support for :mod:`Google App Engine standard credentials <google.auth.app_engine>`.
- Support for various transports, including
:mod:`Requests <google.auth.transport.requests>`,
:mod:`urllib3 <google.auth.transport.urllib3>`, and
:mod:`gRPC <google.auth.transport.grpc>`.

This comment was marked as spam.

This comment was marked as spam.


Installing
----------

google-auth can be installed with `pip <https://pip.pypa.io>`_::

This comment was marked as spam.

This comment was marked as spam.


$ pip install google-auth

This comment was marked as spam.

This comment was marked as spam.


google-auth is open-source, so you can alternatively grab the source code from
`GitHub`_ and install from source.

.. _GitHub: https://github.com/GoogleCloudPlatform/google-auth-library-python

Usage
-----

The :doc:`user-guide` is the place to go to learn how to use the library and
accomplish common tasks.

The :doc:`Module Reference <reference/modules>` documentation provides API-level documentation.

License
-------

Reference documentation
=======================
google-auth is made available under the Apache License, Version 2.0. For more
details, see `LICENSE`_

The :doc:`reference documentation <reference/modules>` details the complete API for :mod:`google.auth` and :mod:`google.oauth2`.
.. _LICENSE:
https://github.com/GoogleCloudPlatform/google-auth-library-python/LICENSE

Indices and tables
==================
Contributing
------------

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
We happily welcome contributions, please see our `contributing`_ documentation
for details.

.. _contributing:
https://github.com/GoogleCloudPlatform/google-auth-library-python/CONTRIBUTING.rst
267 changes: 267 additions & 0 deletions docs/user-guide.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,267 @@
User Guide
==========

.. currentmodule:: google.auth

This comment was marked as spam.

This comment was marked as spam.


Credentials and account types
-----------------------------

:class:`~credentials.Credentials` are the means of identifying an application or
user to a service or API. Credentials can be obtained with two different types
of accounts: *service accounts* and *user accounts*. Credentials from service
accounts identify a particular application. These types of credentials are used
in server-to-server use cases, such as accessing a database. Credentials from
user accounts are obtained by asking the user to authorize access to their data.
These types of credentials are used in cases where your application needs access
to a user's data in another service, such as accessing a user's documents in
Google Drive.

This comment was marked as spam.

This comment was marked as spam.


This library primarily focuses on service account credentials and provides
some limited support for user credentials.

Obtaining credentials
---------------------

.. _application-default:

Application default credentials
+++++++++++++++++++++++++++++++

`Google Application Default Credentials`_ abstracts authentication across the
different Google Cloud Platform hosting environments. When running on any Google
Cloud hosting environment or when running locally with the `Google Cloud SDK`_
installed :func:`default` can automatically determine the credentials from the

This comment was marked as spam.

This comment was marked as spam.

environment::

This comment was marked as spam.

This comment was marked as spam.


import google.auth

credentials, project = google.auth.default()

If your application requires specific scopes::

credentials, project = google.auth.default(
scopes=['https://www.googleapis.com/auth/cloud-platform'])

.. _Google Application Default Credentials:
https://developers.google.com/identity/protocols/application-default-credentials
.. _Google Cloud SDK: https://cloud.google.com/sdk


Service account private key files
+++++++++++++++++++++++++++++++++

A service account private key file can be used to obtain credentials for a
service account. You can create a private key using the `Credentials page of the
Google Cloud Console`_. Once you have a private key you can either obtain

This comment was marked as spam.

This comment was marked as spam.

credentials one of two ways:

1. Set the ``GOOGLE_APPLICATION_CREDENTIALS`` environment variable to the full
path to your service account private key file::

This comment was marked as spam.

This comment was marked as spam.


$ export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json

Then, use :ref:`application default credentials <application-default>`.
:func:`default` checks for the ``GOOGLE_APPLICATION_CREDENTIALS``
environment variable before all other checks, so this will always use the
credentials you explicitly specify.

2. Use :meth:`service_account.Credentials.from_service_account_file
<google.oauth2.service_account.Credentials.from_service_account_file>`::

This comment was marked as spam.

This comment was marked as spam.


from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(
'/path/to/key.json')

scoped_credentials = credentials.with_scopes(
['https://www.googleapis.com/auth/cloud-platform'])

.. warning:: Private keys must be kept secret. If you expose your private key it
is recommended to revoke it immediately from the Google Cloud Console.

.. _Credentials page of the Google Cloud Console:
https://console.cloud.google.com/apis/credentials

Compute Engine, Container Engine, and the App Engine flexible environment
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Applications running on `Compute Engine`_, `Container Engine`_, or the `App
Engine flexible environment`_ can obtain credentials provided by `Compute
Engine service accounts`_. When running on these platforms you can obtain
credentials for the service account one of two ways:

1. Use :ref:`application default credentials <application-default>`.
:func:`default` will automatically detect if these credentials are available.

2. Use :class:`compute_engine.Credentials`::

from google.auth import compute_engine

credentials = compute_engine.Credentials()

.. _Compute Engine: https://cloud.google.com/compute
.. _Container Engine: https://cloud.google.com/container-engine
.. _App Engine flexible environment:
https://cloud.google.com/appengine/docs/flexible/
.. _Compute Engine service accounts:
https://cloud.google.com/compute/docs/access/service-accounts

The App Engine standard environment
+++++++++++++++++++++++++++++++++++

Applications running on the `App Engine standard environment`_ can obtain
credentials provided by the `App Engine App Identity API`_. You can obtain
credentials one of two ways:

1. Use :ref:`application default credentials <application-default>`.
:func:`default` will automatically detect if these credentials are available.

2. Use :class:`app_engine.Credentials`::

from google.auth import app_engine

credentials = app_engine.Credentials()

.. _App Engine standard environment:
https://cloud.google.com/appengine/docs/python
.. _App Engine App Identity API:
https://cloud.google.com/appengine/docs/python/appidentity/

User credentials
++++++++++++++++

User credentials are typically obtained via `OAuth 2.0`_. This library does not
provide any support for *obtaining* user credentials, however, you can use user
credentials with this library. You can use libraries such as `oauthlib`_ or
`oauth2client`_ to obtain the access token. After you have an access token, you

This comment was marked as spam.

This comment was marked as spam.

can create a :class:`google.oauth2.credentials.Credentials` instance::

import google.oauth2.credentials

credentials = google.oauth2.credentials.Credentials(
'access_token')

If you obtain a refresh token, you can also specify the refresh token and token
URI to allow the credentials to be automatically refreshed::

credentials = google.oauth2.credentials.Credentials(
'access_token',
refresh_token='refresh_token',
token_uri='token_uri',
client_id='client_id',
client_secret='client_secret')

.. _OAuth 2.0:
https://developers.google.com/identity/protocols/OAuth2
.. _oauthlib:
https://oauthlib.readthedocs.io/en/latest/
.. _oauth2client:
https://oauth2client.readthedocs.org

Making authenticated requests
-----------------------------

Once you have credentials you can attach them to a *transport*. You can then
use this transport to make authenticated requests to APIs. google-auth supports
several different transports. Typically, it's up to your application or an
opinionated client library to decide which transport to use.

Requests
++++++++

The recommended HTTP transport is :mod:`google.auth.transport.requests` which
uses the `Requests`_ library. To make authenticated requests using Requests
you use a custom `Session`_ object::

from google.auth.transport.requests import AuthorizedSession

authed_session = AuthorizedSession(credentials)

response = authed_session.get(
'https://www.googleapis.com/storage/v1/b')

.. _Requests: http://docs.python-requests.org/en/master/
.. _Session: http://docs.python-requests.org/en/master/user/advanced/#session-objects

Urllib3

This comment was marked as spam.

This comment was marked as spam.

+++++++

:mod:`urllib3` is the underlying HTTP library used by Requests and can also be
used with google-auth. urllib3's interface isn't as high-level as Requests but
it can be useful in situations where you need more control over how HTTP
requests are made. To make authenticated requests using urllib3 create an
instance of :class:`google.auth.transport.urllib3.AuthorizedHttp`::

from google.auth.transport.urllib3 import AuthorizedHttp

authed_http = AuthorizedHttp(credentials)

response = authed_http.request(
'GET', 'https://www.googleapis.com/storage/v1/b')

You can also construct your own :class:`urllib3.PoolManager` instance and pass
it to :class:`~google.auth.transport.urllib3.AuthorizedHttp`::

import urllib3

http = urllib3.PoolManager()
authed_http = AuthorizedHttp(credentials, http)

gRPC
++++

`gRPC`_ is an RPC framework that uses `Protocol Buffers`_ over `HTTP 2.0`_.
google-auth can provide `Call Credentials`_ for gRPC. The easiest way to do
this is to use google-auth to create the gRPC channel::

import google.auth.transport.grpc
import google.auth.transport.requests

http_request = google.auth.transport.requests.Request()

This comment was marked as spam.

This comment was marked as spam.


channel = google.auth.transport.grpc.secure_authorized_channel(
credentials, 'pubsub.googleapis.com:443', http_request)

.. note:: Even though gRPC is its own transport, you still need to use one of
the other HTTP transports with gRPC. The reason is that most credential

This comment was marked as spam.

This comment was marked as spam.

types need to make HTTP requests in order to refresh their access token.

Alternatively, you can create the channel yourself and use
:class:`google.auth.transport.grpc.AuthMetadataPlugin`::

import grpc

metadata_plugin = AuthMetadataPlugin(credentials, http_request)

# Create a set of grpc.CallCredentials using the metadata plugin.
google_auth_credentials = grpc.metadata_call_credentials(
metadata_plugin)

# Create SSL channel credentials.
ssl_credentials = grpc.ssl_channel_credentials()

# Combine the ssl credentials and the authorization credentials.
composite_credentials = grpc.composite_channel_credentials(
ssl_credentials, google_auth_credentials)

channel = grpc.secure_channel(
'pubsub.googleapis.com:443', composite_credentials)

This comment was marked as spam.

This comment was marked as spam.


You can use this channel to make a gRPC stub that makes authenticated requests
to a gRPC service::

from google.pubsub.v1 import pubsub_pb2

pubsub = pubsub_pb2.PublisherStub(channel)

response = pubsub.ListTopics(
pubsub_pb2.ListTopicsRequest(project='your-project'))


.. _gRPC: http://www.grpc.io/
.. _Protocol Buffers:
https://developers.google.com/protocol-buffers/docs/overview
.. _HTTP 2.0:
http://www.grpc.io/docs/guides/wire.html
.. _Call Credentials:
http://www.grpc.io/docs/guides/auth.html