14
14
15
15
"""Firebase auth client sub module."""
16
16
17
+ import os
17
18
import time
18
19
20
+ from google .oauth2 import credentials
21
+
19
22
import firebase_admin
20
23
from firebase_admin import _auth_providers
21
24
from firebase_admin import _auth_utils
25
28
from firebase_admin import _user_import
26
29
from firebase_admin import _user_mgt
27
30
31
+ _EMULATOR_HOST_ENV_VAR = 'FIREBASE_AUTH_EMULATOR_HOST'
32
+ _DEFAULT_AUTH_URL = 'https://identitytoolkit.googleapis.com'
28
33
29
34
class Client :
30
35
"""Firebase Authentication client scoped to a specific tenant."""
@@ -36,17 +41,39 @@ def __init__(self, app, tenant_id=None):
36
41
2. set the project ID explicitly via Firebase App options, or
37
42
3. set the project ID via the GOOGLE_CLOUD_PROJECT environment variable.""" )
38
43
39
- credential = app . credential . get_credential ()
44
+ credential = None
40
45
version_header = 'Python/Admin/{0}' .format (firebase_admin .__version__ )
46
+ http_headers = {'X-Client-Version' : version_header }
47
+ # Non-default endpoint URLs for emulator support are set in this dict later.
48
+ id_toolkit_endpoints = {}
49
+
50
+ # If an emulator is present, check that the given value matches the expected format and set
51
+ # endpoint URLs to use the emulator. Also set a fake authorization token.
52
+ emulator_host = os .environ .get (_EMULATOR_HOST_ENV_VAR )
53
+ if emulator_host :
54
+ if '//' in emulator_host :
55
+ raise ValueError (
56
+ 'Invalid {0}: "{1}". It must follow format "host:port".' .format (
5
8000
7
+ _EMULATOR_HOST_ENV_VAR , emulator_host ))
58
+ base_url = 'http://{0}/identitytoolkit.googleapis.com' .format (emulator_host )
59
+ id_toolkit_endpoints ['v1' ] = base_url + '/v1'
60
+ id_toolkit_endpoints ['v2beta1' ] = base_url + '/v2beta1'
61
+ # Used instead of user-supplied credentials (which aren't necessary for the emulator)
62
+ credential = credentials .Credentials (token = 'owner' )
63
+ else :
64
+ credential = app .credential .get_credential ()
65
+
41
66
http_client = _http_client .JsonHttpClient (
42
- credential = credential , headers = { 'X-Client-Version' : version_header } )
67
+ credential = credential , headers = http_headers )
43
68
44
69
self ._tenant_id = tenant_id
45
- self ._token_generator = _token_gen .TokenGenerator (app , http_client )
70
+ self ._token_generator = _token_gen .TokenGenerator (
71
+ app , http_client , id_toolkit_endpoints .get ('v1' ))
46
72
self ._token_verifier = _token_gen .TokenVerifier (app )
47
- self ._user_manager = _user_mgt .UserManager (http_client , app .project_id , tenant_id )
73
+ self ._user_manager = _user_mgt .UserManager (
74
+ http_client , app .project_id , tenant_id , id_toolkit_endpoints .get ('v1' ))
48
75
self ._provider_
8000
manager = _auth_providers .ProviderConfigClient (
49
- http_client , app .project_id , tenant_id )
76
+ http_client , app .project_id , tenant_id , id_toolkit_endpoints . get ( 'v2beta1' ) )
50
77
51
78
@property
52
79
def tenant_id (self ):
0 commit comments