Skip to content

Commit c44df7f

Browse files
authored
Use timestamp check for token refresh (feast-dev#1444)
Signed-off-by: Terence Lim <terencelimxp@gmail.com>
1 parent 81945f3 commit c44df7f

2 files changed

Lines changed: 22 additions & 3 deletions

File tree

sdk/python/feast/grpc/auth.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
import json
16+
import time
1617
from http import HTTPStatus
1718

1819
import grpc
@@ -159,6 +160,7 @@ def __init__(self, config: Config):
159160

160161
self._static_token = None
161162
self._token = None
163+
self._token_expiry_ts = time.time()
162164

163165
# If provided, set a static token
164166
if config.exists(opt.AUTH_TOKEN):
@@ -169,6 +171,9 @@ def __init__(self, config: Config):
169171

170172
def get_signed_meta(self):
171173
""" Creates a signed authorization metadata token."""
174+
175+
if time.time() > self._token_expiry_ts:
176+
self._refresh_token()
172177
return (("authorization", "Bearer {}".format(self._token)),)
173178

174179
def _refresh_token(self):
@@ -179,10 +184,13 @@ def _refresh_token(self):
179184
self._token = self._static_token
180185
return
181186

182-
from google.oauth2.id_token import fetch_id_token
187+
from google.oauth2.id_token import fetch_id_token, verify_oauth2_token
183188

184189
try:
185190
self._token = fetch_id_token(self._request, audience="feast.dev")
191+
self._token_expiry_ts = verify_oauth2_token(self._token, self._request)[
192+
"exp"
193+
]
186194
return
187195
except DefaultCredentialsError:
188196
pass
@@ -195,6 +203,9 @@ def _refresh_token(self):
195203
credentials.refresh(self._request)
196204
if hasattr(credentials, "id_token"):
197205
self._token = credentials.id_token
206+
self._token_expiry_ts = verify_oauth2_token(self._token, self._request)[
207+
"exp"
208+
]
198209
return
199210
except DefaultCredentialsError:
200211
pass # Could not determine credentials, skip

sdk/python/tests/grpc/test_auth.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,13 @@ def test_get_auth_metadata_plugin_oauth_should_raise_when_config_is_incorrect(
147147
get_auth_metadata_plugin(config_with_missing_variable)
148148

149149

150+
@patch(
151+
"google.oauth2.id_token.verify_token",
152+
return_value={"iss": "accounts.google.com", "exp": 12341234},
153+
)
150154
@patch("google.oauth2.id_token.fetch_id_token", return_value="Some Token")
151155
def test_get_auth_metadata_plugin_google_should_pass_with_token_from_gcloud_sdk(
152-
fetch_id_token, config_google
156+
verify_token, fetch_id_token, config_google
153157
):
154158
auth_metadata_plugin = get_auth_metadata_plugin(config_google)
155159
assert isinstance(auth_metadata_plugin, GoogleOpenIDAuthMetadataPlugin)
@@ -158,6 +162,10 @@ def test_get_auth_metadata_plugin_google_should_pass_with_token_from_gcloud_sdk(
158162
)
159163

160164

165+
@patch(
166+
"google.oauth2.id_token.verify_token",
167+
return_value={"iss": "accounts.google.com", "exp": 12341234},
168+
)
161169
@patch(
162170
"google.auth.default",
163171
return_value=[
@@ -167,7 +175,7 @@ def test_get_auth_metadata_plugin_google_should_pass_with_token_from_gcloud_sdk(
167175
)
168176
@patch("google.oauth2.id_token.fetch_id_token", side_effect=DefaultCredentialsError())
169177
def test_get_auth_metadata_plugin_google_should_pass_with_token_from_google_auth_lib(
170-
fetch_id_token, default, config_google
178+
verify_token, fetch_id_token, default, config_google
171179
):
172180
auth_metadata_plugin = get_auth_metadata_plugin(config_google)
173181
assert isinstance(auth_metadata_plugin, GoogleOpenIDAuthMetadataPlugin)

0 commit comments

Comments
 (0)