Skip to content

Commit 9756b32

Browse files
tseaverJon Wayne Parrott
authored andcommitted
Add 'AnonymousCredentials' class. (#206)
* Add 'AnonymousCredentials' class. See: #4279. * Nits * Fix whitespace
1 parent be22c73 commit 9756b32

2 files changed

Lines changed: 73 additions & 0 deletions

File tree

packages/google-auth/google/auth/credentials.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,43 @@ def before_request(self, request, method, url, headers):
122122
self.apply(headers)
123123

124124

125+
class AnonymousCredentials(Credentials):
126+
"""Credentials that do not provide any authentication information.
127+
128+
These are useful in the case of services that support anonymous access or
129+
local service emulators that do not use credentials.
130+
"""
131+
132+
@property
133+
def expired(self):
134+
"""Returns `False`, anonymous credentials never expire."""
135+
return False
136+
137+
@property
138+
def valid(self):
139+
"""Returns `True`, anonymous credentials are always valid."""
140+
return True
141+
142+
def refresh(self, request):
143+
"""Raises :class:`ValueError``, anonymous credentials cannot be
144+
refreshed."""
145+
raise ValueError("Anonymous credentials cannot be refreshed.")
146+
147+
def apply(self, headers, token=None):
148+
"""Anonymous credentials do nothing to the request.
149+
150+
The optional ``token`` argument is not supported.
151+
152+
Raises:
153+
ValueError: If a token was specified.
154+
"""
155+
if token is not None:
156+
raise ValueError("Anonymous credentials don't support tokens.")
157+
158+
def before_request(self, request, method, url, headers):
159+
"""Anonymous credentials do nothing to the request."""
160+
161+
125162
@six.add_metaclass(abc.ABCMeta)
126163
class ReadOnlyScoped(object):
127164
"""Interface for credentials whose scopes can be queried.

packages/google-auth/tests/test_credentials.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
import datetime
1616

17+
import pytest
18+
1719
from google.auth import _helpers
1820
from google.auth import credentials
1921

@@ -77,6 +79,40 @@ def test_before_request():
7779
assert headers['authorization'] == 'Bearer token'
7880

7981

82+
def test_anonymous_credentials_ctor():
83+
anon = credentials.AnonymousCredentials()
84+
assert anon.token is None
85+
assert anon.expiry is None
86+
assert not anon.expired
87+
assert anon.valid
88+
89+
90+
def test_anonymous_credentials_refresh():
91+
anon = credentials.AnonymousCredentials()
92+
request = object()
93+
with pytest.raises(ValueError):
94+
anon.refresh(request)
95+
96+
97+
def test_anonymous_credentials_apply_default():
98+
anon = credentials.AnonymousCredentials()
99+
headers = {}
100+
anon.apply(headers)
101+
assert headers == {}
102+
with pytest.raises(ValueError):
103+
anon.apply(headers, token='TOKEN')
104+
105+
106+
def test_anonymous_credentials_before_request():
107+
anon = credentials.AnonymousCredentials()
108+
request = object()
109+
method = 'GET'
110+
url = 'https://example.com/api/endpoint'
111+
headers = {}
112+
anon.before_request(request, method, url, headers)
113+
assert headers == {}
114+
115+
80116
class ReadOnlyScopedCredentialsImpl(
81117
credentials.ReadOnlyScoped, CredentialsImpl):
82118
@property

0 commit comments

Comments
 (0)