@@ -52,6 +52,16 @@ class ServerType(Enum):
5252 SAAS = auto () # Server is SaaS
5353
5454
55+ class LoginType (Enum ):
56+ """Types of login supported by Mergin Maps."""
57+
58+ PASSWORD = "password" # classic login with username and password
59+ SSO = "sso" # login with SSO token
60+
61+ def __str__ (self ) -> str :
62+ return self .value
63+
64+
5565def decode_token_data (token ):
5666 token_prefix = "Bearer ."
5767 if not token .startswith (token_prefix ):
@@ -80,14 +90,24 @@ class MerginClient:
8090 Currently, only HTTP proxies are supported.
8191 """
8292
83- def __init__ (self , url = None , auth_token = None , login = None , password = None , plugin_version = None , proxy_config = None ):
93+ def __init__ (
94+ self ,
95+ url = None ,
96+ auth_token = None ,
97+ login = None ,
98+ password = None ,
99+ plugin_version = None ,
100+ proxy_config = None ,
101+ login_type : LoginType = LoginType .PASSWORD ,
102+ ):
84103 self .url = url if url is not None else MerginClient .default_url ()
85104 self ._auth_params = None
86105 self ._auth_session = None
87106 self ._user_info = None
88107 self ._server_type = None
89108 self ._server_version = None
90109 self .client_version = "Python-client/" + __version__
110+ self ._login_type = login_type
91111 if plugin_version is not None : # this could be e.g. "Plugin/2020.1 QGIS/3.14"
92112 self .client_version += " " + plugin_version
93113 self .setup_logging ()
@@ -134,15 +154,20 @@ def __init__(self, url=None, auth_token=None, login=None, password=None, plugin_
134154 self .opener = urllib .request .build_opener (* handlers , https_handler )
135155 urllib .request .install_opener (self .opener )
136156
137- if login and not password :
138- raise ClientError ("Unable to log in: no password provided for '{}'" .format (login ))
139- if password and not login :
140- raise ClientError ("Unable to log in: password provided but no username/email" )
157+ if self ._login_type == LoginType .PASSWORD :
158+ if login and not password :
159+ raise ClientError ("Unable to log in: no password provided for '{}'" .format (login ))
160+ if password and not login :
161+ raise ClientError ("Unable to log in: password provided but no username/email" )
162+
163+ if login and password :
164+ self ._auth_params = {"login" : login , "password" : password }
165+ if not self ._auth_session :
166+ self .login (login , password )
141167
142- if login and password :
143- self ._auth_params = {"login" : login , "password" : password }
168+ elif self ._login_type == LoginType .SSO :
144169 if not self ._auth_session :
145- self . login ( login , password )
170+ raise ClientError ( "Unable to log in: no auth token provided for SSO login" )
146171
147172 def setup_logging (self ):
148173 """Setup Mergin Maps client logging."""
0 commit comments