blob: a9b296d4394d370d26c8ed285401eb9c25b67007 [file] [log] [blame]
Authentication
**************
.. _Overview:
Overview
========
For a language agnostic overview of authentication on Google Cloud, see `Authentication Overview`_.
.. _Authentication Overview: https://cloud.google.com/docs/authentication
* **If you're running in a Google Virtual Machine Environment (Compute Engine, App Engine, Cloud Run, Cloud Functions)**,
authentication should "just work".
* **If you're developing locally**,
the easiest way to authenticate is using the `Google Cloud SDK`_:
.. code-block:: bash
$ gcloud auth application-default login
Note that this command generates credentials for client libraries. To authenticate the CLI itself, use:
.. code-block:: bash
$ gcloud auth login
Previously, ``gcloud auth login`` was used for both use cases. If
your ``gcloud`` installation does not support the new command,
please update it:
.. code-block:: bash
$ gcloud components update
.. _Google Cloud SDK: http://cloud.google.com/sdk
* **If you're running your application elsewhere**,
you should download a `service account`_ JSON keyfile
and point to it using an environment variable:
.. code-block:: bash
$ export GOOGLE_APPLICATION_CREDENTIALS="/path/to/keyfile.json"
.. _service account: https://cloud.google.com/iam/docs/creating-managing-service-accounts#creating
Client-Provided Authentication
==============================
Every package uses a :class:`Client <google.cloud.client.Client>`
as a base for interacting with an API.
For example:
.. code-block:: python
from google.cloud import datastore
client = datastore.Client()
Passing no arguments at all will "just work" if you've followed the
instructions in the :ref:`Overview`.
The credentials are inferred from your local environment by using
Google `Application Default Credentials`_.
.. _Application Default Credentials: https://developers.google.com/identity/protocols/application-default-credentials
.. _Precedence:
Credential Discovery Precedence
-------------------------------
When loading the `Application Default Credentials`_,
the library will check for credentials in your environment by following the
precedence outlined by :func:`google.auth.default`.
Explicit Credentials
====================
The Application Default Credentials discussed above can be useful
if your code needs to run in many different environments or
if you just don't want authentication to be a focus in your code.
However, you may want to be explicit because
* your code will only run in one place
* you may have code which needs to be run as a specific service account
every time (rather than with the locally inferred credentials)
* you may want to use two separate accounts to simultaneously access data
from different projects
In these situations, you can create an explicit
:class:`~google.auth.credentials.Credentials` object suited to your environment.
After creation, you can pass it directly to a :class:`Client <google.cloud.client.Client>`:
.. code:: python
client = Client(credentials=credentials)
.. tip::
To create a credentials object, follow the `google-auth-guide`_.
.. _google-auth-guide: https://googleapis.dev/python/google-auth/latest/user-guide.html#service-account-private-key-files
Google Compute Engine Environment
---------------------------------
These credentials are used in Google Virtual Machine Environments.
This includes most App Engine runtimes, Compute Engine, Cloud
Functions, and Cloud Run.
To create
:class:`credentials <google.auth.compute_engine.Credentials>`:
.. code:: python
from google.auth import compute_engine
credentials = compute_engine.Credentials()
Service Accounts
----------------
A `service account`_ is stored in a JSON keyfile.
.. code:: python
from google.oauth2 import service_account
credentials = service_account.Credentials.from_service_account_file(
'/path/to/key.json')
A JSON string or dictionary:
.. code:: python
import json
from google.oauth2 import service_account
json_account_info = json.loads(...) # convert JSON to dictionary
credentials = service_account.Credentials.from_service_account_info(
json_account_info)
.. tip::
Previously the Google Cloud Console would issue a PKCS12/P12 key for your
service account. This library does not support that key format. You can
generate a new JSON key for the same service account from the console.
User Accounts (3-legged OAuth 2.0) with a refresh token
-------------------------------------------------------
The majority of cases are intended to authenticate machines or
workers rather than actual user accounts. However, it's also
possible to call Google Cloud APIs with a user account via
`OAuth 2.0`_.
.. _OAuth 2.0: https://developers.google.com/identity/protocols/OAuth2
.. tip::
A production application should **use a service account**,
but you may wish to use your own personal user account when first
getting started with the ``google-cloud-*`` library.
The simplest way to use credentials from a user account is via
Application Default Credentials using ``gcloud auth login``
(as mentioned above) and :func:`google.auth.default`:
.. code:: python
import google.auth
credentials, project = google.auth.default()
This will still follow the :ref:`precedence <Precedence>`
described above,
so be sure none of the other possible environments conflict
with your user provided credentials.
Troubleshooting
===============
Setting up a Service Account
----------------------------
If your application is not running on a Google Virtual Machine Environment,
you need a Service Account. See `Creating a Service Account`_.
.. _Creating a Service Account: https://cloud.google.com/iam/docs/creating-managing-service-accounts#creating
Using Google Compute Engine
---------------------------
If your code is running on Google Compute Engine,
using the inferred Google `Application Default Credentials`_
will be sufficient for retrieving credentials.
However, by default your credentials may not grant you
access to the services you intend to use.
Be sure when you `set up the GCE instance`_,
you add the correct scopes for the APIs you want to access:
* **All APIs**
* ``https://www.googleapis.com/auth/cloud-platform``
* ``https://www.googleapis.com/auth/cloud-platform.read-only``
For scopes for specific APIs see `OAuth 2.0 Scopes for Google APIs`_
.. _set up the GCE instance: https://cloud.google.com/compute/docs/authentication#using
.. _OAuth 2.0 Scopes for Google APIS: https://developers.google.com/identity/protocols/oauth2/scopes