|
15 | 15 | """MONGODB-OIDC Authentication helpers."""
|
16 | 16 | from __future__ import annotations
|
17 | 17 |
|
18 |
| -import abc |
19 |
| -import os |
20 | 18 | import threading
|
21 | 19 | import time
|
22 | 20 | from dataclasses import dataclass, field
|
23 | 21 | from typing import TYPE_CHECKING, Any, Mapping, MutableMapping, Optional, Union
|
24 |
| -from urllib.parse import quote |
25 | 22 |
|
26 | 23 | import bson
|
27 | 24 | from bson.binary import Binary
|
28 |
| -from pymongo._azure_helpers import _get_azure_response |
29 | 25 | from pymongo._csot import remaining
|
30 |
| -from pymongo._gcp_helpers import _get_gcp_response |
| 26 | +from pymongo.auth_oidc_shared import ( |
| 27 | + CALLBACK_VERSION, |
| 28 | + HUMAN_CALLBACK_TIMEOUT_SECONDS, |
| 29 | + MACHINE_CALLBACK_TIMEOUT_SECONDS, |
| 30 | + TIME_BETWEEN_CALLS_SECONDS, |
| 31 | + OIDCCallback, |
| 32 | + OIDCCallbackContext, |
| 33 | + OIDCCallbackResult, |
| 34 | + OIDCIdPInfo, |
| 35 | + _OIDCProperties, |
| 36 | +) |
31 | 37 | from pymongo.errors import ConfigurationError, OperationFailure
|
32 |
| -from pymongo.helpers import _AUTHENTICATION_FAILURE_CODE |
| 38 | +from pymongo.helpers_shared import _AUTHENTICATION_FAILURE_CODE |
33 | 39 |
|
34 | 40 | if TYPE_CHECKING:
|
35 |
| - from pymongo.auth import MongoCredential |
36 |
| - from pymongo.pool import Connection |
| 41 | + from pymongo.auth_shared import MongoCredential |
| 42 | + from pymongo.synchronous.pool import Connection |
37 | 43 |
|
38 |
| - |
39 |
| -@dataclass |
40 |
| -class OIDCIdPInfo: |
41 |
| - issuer: str |
42 |
| - clientId: Optional[str] = field(default=None) |
43 |
| - requestScopes: Optional[list[str]] = field(default=None) |
44 |
| - |
45 |
| - |
46 |
| -@dataclass |
47 |
| -class OIDCCallbackContext: |
48 |
| - timeout_seconds: float |
49 |
| - username: str |
50 |
| - version: int |
51 |
| - refresh_token: Optional[str] = field(default=None) |
52 |
| - idp_info: Optional[OIDCIdPInfo] = field(default=None) |
53 |
| - |
54 |
| - |
55 |
| -@dataclass |
56 |
| -class OIDCCallbackResult: |
57 |
| - access_token: str |
58 |
| - expires_in_seconds: Optional[float] = field(default=None) |
59 |
| - refresh_token: Optional[str] = field(default=None) |
60 |
| - |
61 |
| - |
62 |
| -class OIDCCallback(abc.ABC): |
63 |
| - """A base class for defining OIDC callbacks.""" |
64 |
| - |
65 |
| - @abc.abstractmethod |
66 |
| - def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult: |
67 |
| - """Convert the given BSON value into our own type.""" |
68 |
| - |
69 |
| - |
70 |
| -@dataclass |
71 |
| -class _OIDCProperties: |
72 |
| - callback: Optional[OIDCCallback] = field(default=None) |
73 |
| - human_callback: Optional[OIDCCallback] = field(default=None) |
74 |
| - environment: Optional[str] = field(default=None) |
75 |
| - allowed_hosts: list[str] = field(default_factory=list) |
76 |
| - token_resource: Optional[str] = field(default=None) |
77 |
| - username: str = "" |
78 |
| - |
79 |
| - |
80 |
| -"""Mechanism properties for MONGODB-OIDC authentication.""" |
81 |
| - |
82 |
| -TOKEN_BUFFER_MINUTES = 5 |
83 |
| -HUMAN_CALLBACK_TIMEOUT_SECONDS = 5 * 60 |
84 |
| -CALLBACK_VERSION = 1 |
85 |
| -MACHINE_CALLBACK_TIMEOUT_SECONDS = 60 |
86 |
| -TIME_BETWEEN_CALLS_SECONDS = 0.1 |
| 44 | +_IS_SYNC = True |
87 | 45 |
|
88 | 46 |
|
89 | 47 | def _get_authenticator(
|
@@ -115,37 +73,6 @@ def _get_authenticator(
|
115 | 73 | return credentials.cache.data
|
116 | 74 |
|
117 | 75 |
|
118 |
| -class _OIDCTestCallback(OIDCCallback): |
119 |
| - def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult: |
120 |
| - token_file = os.environ.get("OIDC_TOKEN_FILE") |
121 |
| - if not token_file: |
122 |
| - raise RuntimeError( |
123 |
| - 'MONGODB-OIDC with an "test" provider requires "OIDC_TOKEN_FILE" to be set' |
124 |
| - ) |
125 |
| - with open(token_file) as fid: |
126 |
| - return OIDCCallbackResult(access_token=fid.read().strip()) |
127 |
| - |
128 |
| - |
129 |
| -class _OIDCAzureCallback(OIDCCallback): |
130 |
| - def __init__(self, token_resource: str) -> None: |
131 |
| - self.token_resource = quote(token_resource) |
132 |
| - |
133 |
| - def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult: |
134 |
| - resp = _get_azure_response(self.token_resource, context.username, context.timeout_seconds) |
135 |
| - return OIDCCallbackResult( |
136 |
| - access_token=resp["access_token"], expires_in_seconds=resp["expires_in"] |
137 |
| - ) |
138 |
| - |
139 |
| - |
140 |
| -class _OIDCGCPCallback(OIDCCallback): |
141 |
| - def __init__(self, token_resource: str) -> None: |
142 |
| - self.token_resource = quote(token_resource) |
143 |
| - |
144 |
| - def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult: |
145 |
| - resp = _get_gcp_response(self.token_resource, context.timeout_seconds) |
146 |
| - return OIDCCallbackResult(access_token=resp["access_token"]) |
147 |
| - |
148 |
| - |
149 | 76 | @dataclass
|
150 | 77 | class _OIDCAuthenticator:
|
151 | 78 | username: str
|
|
0 commit comments