Jon Wayne Parrott | 53c7b17 | 2016-11-10 10:44:30 -0800 | [diff] [blame] | 1 | User Guide |
| 2 | ========== |
| 3 | |
| 4 | .. currentmodule:: google.auth |
| 5 | |
| 6 | Credentials and account types |
| 7 | ----------------------------- |
| 8 | |
| 9 | :class:`~credentials.Credentials` are the means of identifying an application or |
| 10 | user to a service or API. Credentials can be obtained with two different types |
| 11 | of accounts: *service accounts* and *user accounts*. |
| 12 | |
| 13 | Credentials from service accounts identify a particular application. These types |
| 14 | of credentials are used in server-to-server use cases, such as accessing a |
| 15 | database. This library primarily focuses on service account credentials. |
| 16 | |
| 17 | Credentials from user accounts are obtained by asking the user to authorize |
| 18 | access to their data. These types of credentials are used in cases where your |
| 19 | application needs access to a user's data in another service, such as accessing |
| 20 | a user's documents in Google Drive. This library provides no support for |
| 21 | obtaining user credentials, but does provide limited support for using user |
| 22 | credentials. |
| 23 | |
| 24 | Obtaining credentials |
| 25 | --------------------- |
| 26 | |
| 27 | .. _application-default: |
| 28 | |
| 29 | Application default credentials |
| 30 | +++++++++++++++++++++++++++++++ |
| 31 | |
| 32 | `Google Application Default Credentials`_ abstracts authentication across the |
| 33 | different Google Cloud Platform hosting environments. When running on any Google |
| 34 | Cloud hosting environment or when running locally with the `Google Cloud SDK`_ |
| 35 | installed, :func:`default` can automatically determine the credentials from the |
| 36 | environment:: |
| 37 | |
| 38 | import google.auth |
| 39 | |
| 40 | credentials, project = google.auth.default() |
| 41 | |
| 42 | If your application requires specific scopes:: |
| 43 | |
| 44 | credentials, project = google.auth.default( |
| 45 | scopes=['https://www.googleapis.com/auth/cloud-platform']) |
| 46 | |
| 47 | .. _Google Application Default Credentials: |
| 48 | https://developers.google.com/identity/protocols/ |
| 49 | application-default-credentials |
| 50 | .. _Google Cloud SDK: https://cloud.google.com/sdk |
| 51 | |
| 52 | |
| 53 | Service account private key files |
| 54 | +++++++++++++++++++++++++++++++++ |
| 55 | |
| 56 | A service account private key file can be used to obtain credentials for a |
| 57 | service account. You can create a private key using the `Credentials page of the |
| 58 | Google Cloud Console`_. Once you have a private key you can either obtain |
| 59 | credentials one of two ways: |
| 60 | |
| 61 | 1. Set the ``GOOGLE_APPLICATION_CREDENTIALS`` environment variable to the full |
| 62 | path to your service account private key file |
| 63 | |
| 64 | .. code-block:: bash |
| 65 | |
| 66 | $ export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json |
| 67 | |
| 68 | Then, use :ref:`application default credentials <application-default>`. |
| 69 | :func:`default` checks for the ``GOOGLE_APPLICATION_CREDENTIALS`` |
| 70 | environment variable before all other checks, so this will always use the |
| 71 | credentials you explicitly specify. |
| 72 | |
| 73 | 2. Use :meth:`service_account.Credentials.from_service_account_file |
| 74 | <google.oauth2.service_account.Credentials.from_service_account_file>`:: |
| 75 | |
| 76 | from google.oauth2 import service_account |
| 77 | |
| 78 | credentials = service_account.Credentials.from_service_account_file( |
| 79 | '/path/to/key.json') |
| 80 | |
| 81 | scoped_credentials = credentials.with_scopes( |
| 82 | ['https://www.googleapis.com/auth/cloud-platform']) |
| 83 | |
| 84 | .. warning:: Private keys must be kept secret. If you expose your private key it |
| 85 | is recommended to revoke it immediately from the Google Cloud Console. |
| 86 | |
| 87 | .. _Credentials page of the Google Cloud Console: |
| 88 | https://console.cloud.google.com/apis/credentials |
| 89 | |
| 90 | Compute Engine, Container Engine, and the App Engine flexible environment |
| 91 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| 92 | |
| 93 | Applications running on `Compute Engine`_, `Container Engine`_, or the `App |
| 94 | Engine flexible environment`_ can obtain credentials provided by `Compute |
| 95 | Engine service accounts`_. When running on these platforms you can obtain |
| 96 | credentials for the service account one of two ways: |
| 97 | |
| 98 | 1. Use :ref:`application default credentials <application-default>`. |
| 99 | :func:`default` will automatically detect if these credentials are available. |
| 100 | |
| 101 | 2. Use :class:`compute_engine.Credentials`:: |
| 102 | |
| 103 | from google.auth import compute_engine |
| 104 | |
| 105 | credentials = compute_engine.Credentials() |
| 106 | |
| 107 | .. _Compute Engine: https://cloud.google.com/compute |
| 108 | .. _Container Engine: https://cloud.google.com/container-engine |
| 109 | .. _App Engine flexible environment: |
| 110 | https://cloud.google.com/appengine/docs/flexible/ |
| 111 | .. _Compute Engine service accounts: |
| 112 | https://cloud.google.com/compute/docs/access/service-accounts |
| 113 | |
| 114 | The App Engine standard environment |
| 115 | +++++++++++++++++++++++++++++++++++ |
| 116 | |
| 117 | Applications running on the `App Engine standard environment`_ can obtain |
| 118 | credentials provided by the `App Engine App Identity API`_. You can obtain |
| 119 | credentials one of two ways: |
| 120 | |
| 121 | 1. Use :ref:`application default credentials <application-default>`. |
| 122 | :func:`default` will automatically detect if these credentials are available. |
| 123 | |
| 124 | 2. Use :class:`app_engine.Credentials`:: |
| 125 | |
| 126 | from google.auth import app_engine |
| 127 | |
| 128 | credentials = app_engine.Credentials() |
| 129 | |
Hiranya Jayathilaka | 22d9094 | 2017-07-17 09:08:49 -0700 | [diff] [blame] | 130 | In order to make authenticated requests in the App Engine environment using the |
| 131 | credentials and transports provided by this library, you need to follow a few |
| 132 | additional steps: |
| 133 | |
| 134 | #. If you are using the :mod:`google.auth.transport.requests` transport, vendor |
Rohan Talip | b61cecd | 2018-05-29 08:48:25 -0700 | [diff] [blame] | 135 | in the `requests-toolbelt`_ library into your app, and enable the App Engine |
Hiranya Jayathilaka | 22d9094 | 2017-07-17 09:08:49 -0700 | [diff] [blame] | 136 | monkeypatch. Refer `App Engine documentation`_ for more details on this. |
Rohan Talip | b61cecd | 2018-05-29 08:48:25 -0700 | [diff] [blame] | 137 | #. To make HTTPS calls, enable the ``ssl`` library for your app by adding the |
Hiranya Jayathilaka | 22d9094 | 2017-07-17 09:08:49 -0700 | [diff] [blame] | 138 | following configuration to the ``app.yaml`` file:: |
| 139 | |
| 140 | libraries: |
| 141 | - name: ssl |
| 142 | version: latest |
| 143 | |
Rohan Talip | b61cecd | 2018-05-29 08:48:25 -0700 | [diff] [blame] | 144 | #. Enable billing for your App Engine project. Then enable socket support for |
Hiranya Jayathilaka | 22d9094 | 2017-07-17 09:08:49 -0700 | [diff] [blame] | 145 | your app. This can be achieved by setting an environment variable in the |
| 146 | ``app.yaml`` file:: |
| 147 | |
| 148 | env_variables: |
| 149 | GAE_USE_SOCKETS_HTTPLIB : 'true' |
| 150 | |
Jon Wayne Parrott | 53c7b17 | 2016-11-10 10:44:30 -0800 | [diff] [blame] | 151 | .. _App Engine standard environment: |
| 152 | https://cloud.google.com/appengine/docs/python |
| 153 | .. _App Engine App Identity API: |
| 154 | https://cloud.google.com/appengine/docs/python/appidentity/ |
Hiranya Jayathilaka | 22d9094 | 2017-07-17 09:08:49 -0700 | [diff] [blame] | 155 | .. _requests-toolbelt: |
| 156 | https://toolbelt.readthedocs.io/en/latest/ |
| 157 | .. _App Engine documentation: |
| 158 | https://cloud.google.com/appengine/docs/standard/python/issue-requests |
Jon Wayne Parrott | 53c7b17 | 2016-11-10 10:44:30 -0800 | [diff] [blame] | 159 | |
| 160 | User credentials |
| 161 | ++++++++++++++++ |
| 162 | |
| 163 | User credentials are typically obtained via `OAuth 2.0`_. This library does not |
Jon Wayne Parrott | 8170194 | 2017-03-01 14:03:38 -0800 | [diff] [blame] | 164 | provide any direct support for *obtaining* user credentials, however, you can |
| 165 | use user credentials with this library. You can use libraries such as |
| 166 | `oauthlib`_ to obtain the access token. After you have an access token, you |
Jon Wayne Parrott | 53c7b17 | 2016-11-10 10:44:30 -0800 | [diff] [blame] | 167 | can create a :class:`google.oauth2.credentials.Credentials` instance:: |
| 168 | |
| 169 | import google.oauth2.credentials |
| 170 | |
| 171 | credentials = google.oauth2.credentials.Credentials( |
| 172 | 'access_token') |
| 173 | |
| 174 | If you obtain a refresh token, you can also specify the refresh token and token |
| 175 | URI to allow the credentials to be automatically refreshed:: |
| 176 | |
| 177 | credentials = google.oauth2.credentials.Credentials( |
| 178 | 'access_token', |
| 179 | refresh_token='refresh_token', |
| 180 | token_uri='token_uri', |
| 181 | client_id='client_id', |
| 182 | client_secret='client_secret') |
| 183 | |
Jon Wayne Parrott | 8170194 | 2017-03-01 14:03:38 -0800 | [diff] [blame] | 184 | |
Jon Wayne Parrott | d47281b | 2017-03-22 13:45:26 -0700 | [diff] [blame] | 185 | There is a separate library, `google-auth-oauthlib`_, that has some helpers |
| 186 | for integrating with `requests-oauthlib`_ to provide support for obtaining |
| 187 | user credentials. You can use |
| 188 | :func:`google_auth_oauthlib.helpers.credentials_from_session` to obtain |
Jon Wayne Parrott | 8170194 | 2017-03-01 14:03:38 -0800 | [diff] [blame] | 189 | :class:`google.oauth2.credentials.Credentials` from a |
| 190 | :class:`requests_oauthlib.OAuth2Session` as above:: |
| 191 | |
Jon Wayne Parrott | d47281b | 2017-03-22 13:45:26 -0700 | [diff] [blame] | 192 | from google_auth_oauthlib.helpers import credentials_from_session |
Jon Wayne Parrott | 8170194 | 2017-03-01 14:03:38 -0800 | [diff] [blame] | 193 | |
Jon Wayne Parrott | d47281b | 2017-03-22 13:45:26 -0700 | [diff] [blame] | 194 | google_auth_credentials = credentials_from_session(oauth2session) |
Jon Wayne Parrott | 8170194 | 2017-03-01 14:03:38 -0800 | [diff] [blame] | 195 | |
Jon Wayne Parrott | d47281b | 2017-03-22 13:45:26 -0700 | [diff] [blame] | 196 | You can also use :class:`google_auth_oauthlib.flow.Flow` to perform the OAuth |
| 197 | 2.0 Authorization Grant Flow to obtain credentials using `requests-oauthlib`_. |
Jon Wayne Parrott | 8170194 | 2017-03-01 14:03:38 -0800 | [diff] [blame] | 198 | |
Jon Wayne Parrott | 53c7b17 | 2016-11-10 10:44:30 -0800 | [diff] [blame] | 199 | .. _OAuth 2.0: |
| 200 | https://developers.google.com/identity/protocols/OAuth2 |
| 201 | .. _oauthlib: |
| 202 | https://oauthlib.readthedocs.io/en/latest/ |
Jon Wayne Parrott | d47281b | 2017-03-22 13:45:26 -0700 | [diff] [blame] | 203 | .. _google-auth-oauthlib: |
| 204 | https://pypi.python.org/pypi/google-auth-oauthlib |
Jon Wayne Parrott | 8170194 | 2017-03-01 14:03:38 -0800 | [diff] [blame] | 205 | .. _requests-oauthlib: |
| 206 | https://requests-oauthlib.readthedocs.io/en/latest/ |
Jon Wayne Parrott | 53c7b17 | 2016-11-10 10:44:30 -0800 | [diff] [blame] | 207 | |
| 208 | Making authenticated requests |
| 209 | ----------------------------- |
| 210 | |
| 211 | Once you have credentials you can attach them to a *transport*. You can then |
| 212 | use this transport to make authenticated requests to APIs. google-auth supports |
| 213 | several different transports. Typically, it's up to your application or an |
| 214 | opinionated client library to decide which transport to use. |
| 215 | |
| 216 | Requests |
| 217 | ++++++++ |
| 218 | |
| 219 | The recommended HTTP transport is :mod:`google.auth.transport.requests` which |
| 220 | uses the `Requests`_ library. To make authenticated requests using Requests |
| 221 | you use a custom `Session`_ object:: |
| 222 | |
| 223 | from google.auth.transport.requests import AuthorizedSession |
| 224 | |
| 225 | authed_session = AuthorizedSession(credentials) |
| 226 | |
| 227 | response = authed_session.get( |
| 228 | 'https://www.googleapis.com/storage/v1/b') |
| 229 | |
| 230 | .. _Requests: http://docs.python-requests.org/en/master/ |
| 231 | .. _Session: http://docs.python-requests.org/en/master/user/advanced/#session-objects |
| 232 | |
| 233 | urllib3 |
| 234 | +++++++ |
| 235 | |
| 236 | :mod:`urllib3` is the underlying HTTP library used by Requests and can also be |
| 237 | used with google-auth. urllib3's interface isn't as high-level as Requests but |
| 238 | it can be useful in situations where you need more control over how HTTP |
| 239 | requests are made. To make authenticated requests using urllib3 create an |
| 240 | instance of :class:`google.auth.transport.urllib3.AuthorizedHttp`:: |
| 241 | |
| 242 | from google.auth.transport.urllib3 import AuthorizedHttp |
| 243 | |
| 244 | authed_http = AuthorizedHttp(credentials) |
| 245 | |
| 246 | response = authed_http.request( |
| 247 | 'GET', 'https://www.googleapis.com/storage/v1/b') |
| 248 | |
| 249 | You can also construct your own :class:`urllib3.PoolManager` instance and pass |
| 250 | it to :class:`~google.auth.transport.urllib3.AuthorizedHttp`:: |
| 251 | |
| 252 | import urllib3 |
| 253 | |
| 254 | http = urllib3.PoolManager() |
| 255 | authed_http = AuthorizedHttp(credentials, http) |
| 256 | |
| 257 | gRPC |
| 258 | ++++ |
| 259 | |
| 260 | `gRPC`_ is an RPC framework that uses `Protocol Buffers`_ over `HTTP 2.0`_. |
| 261 | google-auth can provide `Call Credentials`_ for gRPC. The easiest way to do |
| 262 | this is to use google-auth to create the gRPC channel:: |
| 263 | |
| 264 | import google.auth.transport.grpc |
| 265 | import google.auth.transport.requests |
| 266 | |
| 267 | http_request = google.auth.transport.requests.Request() |
| 268 | |
| 269 | channel = google.auth.transport.grpc.secure_authorized_channel( |
Jon Wayne Parrott | 840b3ac | 2016-11-10 12:07:51 -0800 | [diff] [blame] | 270 | credentials, http_request, 'pubsub.googleapis.com:443') |
Jon Wayne Parrott | 53c7b17 | 2016-11-10 10:44:30 -0800 | [diff] [blame] | 271 | |
| 272 | .. note:: Even though gRPC is its own transport, you still need to use one of |
| 273 | the other HTTP transports with gRPC. The reason is that most credential |
| 274 | types need to make HTTP requests in order to refresh their access token. |
| 275 | The sample above uses the Requests transport, but any HTTP transport can |
| 276 | be used. Additionally, if you know that your credentials do not need to |
| 277 | make HTTP requests in order to refresh (as is the case with |
| 278 | :class:`jwt.Credentials`) then you can specify ``None``. |
| 279 | |
| 280 | Alternatively, you can create the channel yourself and use |
| 281 | :class:`google.auth.transport.grpc.AuthMetadataPlugin`:: |
| 282 | |
| 283 | import grpc |
| 284 | |
| 285 | metadata_plugin = AuthMetadataPlugin(credentials, http_request) |
| 286 | |
| 287 | # Create a set of grpc.CallCredentials using the metadata plugin. |
| 288 | google_auth_credentials = grpc.metadata_call_credentials( |
| 289 | metadata_plugin) |
| 290 | |
| 291 | # Create SSL channel credentials. |
| 292 | ssl_credentials = grpc.ssl_channel_credentials() |
| 293 | |
| 294 | # Combine the ssl credentials and the authorization credentials. |
| 295 | composite_credentials = grpc.composite_channel_credentials( |
| 296 | ssl_credentials, google_auth_credentials) |
| 297 | |
| 298 | channel = grpc.secure_channel( |
| 299 | 'pubsub.googleapis.com:443', composite_credentials) |
| 300 | |
| 301 | You can use this channel to make a gRPC stub that makes authenticated requests |
| 302 | to a gRPC service:: |
| 303 | |
| 304 | from google.pubsub.v1 import pubsub_pb2 |
| 305 | |
| 306 | pubsub = pubsub_pb2.PublisherStub(channel) |
| 307 | |
| 308 | response = pubsub.ListTopics( |
| 309 | pubsub_pb2.ListTopicsRequest(project='your-project')) |
| 310 | |
| 311 | |
| 312 | .. _gRPC: http://www.grpc.io/ |
| 313 | .. _Protocol Buffers: |
| 314 | https://developers.google.com/protocol-buffers/docs/overview |
| 315 | .. _HTTP 2.0: |
| 316 | http://www.grpc.io/docs/guides/wire.html |
| 317 | .. _Call Credentials: |
| 318 | http://www.grpc.io/docs/guides/auth.html |