opengater-globalauth-client 0.1.3__tar.gz → 0.1.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (19) hide show
  1. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/.idea/workspace.xml +2 -1
  2. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/PKG-INFO +1 -1
  3. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/pyproject.toml +1 -1
  4. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/__init__.py +1 -1
  5. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/fastapi/__init__.py +2 -0
  6. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/fastapi/dependencies.py +44 -16
  7. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
  8. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/.idea/misc.xml +0 -0
  9. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/.idea/modules.xml +0 -0
  10. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/.idea/opengater-globalauth-client.iml +0 -0
  11. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/README.md +0 -0
  12. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/broker/__init__.py +0 -0
  13. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/broker/consumer.py +0 -0
  14. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/broker/events.py +0 -0
  15. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/broker/publisher.py +0 -0
  16. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/client.py +0 -0
  17. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/exceptions.py +0 -0
  18. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/fastapi/middleware.py +0 -0
  19. {opengater_globalauth_client-0.1.3 → opengater_globalauth_client-0.1.5}/src/opengater_globalauth_client/models.py +0 -0
@@ -83,7 +83,8 @@
83
83
  <workItem from="1769083463141" duration="612000" />
84
84
  <workItem from="1769150497374" duration="620000" />
85
85
  <workItem from="1769431218749" duration="1266000" />
86
- <workItem from="1769441499505" duration="2333000" />
86
+ <workItem from="1769441499505" duration="3030000" />
87
+ <workItem from="1769700383611" duration="613000" />
87
88
  </task>
88
89
  <servers />
89
90
  </component>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opengater-globalauth-client
3
- Version: 0.1.3
3
+ Version: 0.1.5
4
4
  Summary: Client library for GlobalAuth authentication service
5
5
  Project-URL: Homepage, https://github.com/opengater/globalauth-client
6
6
  Project-URL: Documentation, https://github.com/opengater/globalauth-client#readme
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "opengater-globalauth-client"
3
- version = "0.1.3"
3
+ version = "0.1.5"
4
4
  description = "Client library for GlobalAuth authentication service"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -63,7 +63,7 @@ FastAPI integration:
63
63
  ```
64
64
  """
65
65
 
66
- __version__ = "0.1.3"
66
+ __version__ = "0.1.5"
67
67
 
68
68
  from opengater_globalauth_client.client import GlobalAuthClient
69
69
  from opengater_globalauth_client.models import (
@@ -7,6 +7,7 @@ from opengater_globalauth_client.fastapi.dependencies import (
7
7
  get_current_user_optional,
8
8
  require_admin,
9
9
  require_verified,
10
+ get_token,
10
11
  )
11
12
 
12
13
  __all__ = [
@@ -16,4 +17,5 @@ __all__ = [
16
17
  "get_current_user_optional",
17
18
  "require_admin",
18
19
  "require_verified",
20
+ "get_token",
19
21
  ]
@@ -3,7 +3,8 @@ FastAPI dependencies for GlobalAuth.
3
3
  """
4
4
  from typing import Callable
5
5
 
6
- from fastapi import Request, HTTPException, Depends, Header
6
+ from fastapi import Request, HTTPException, Depends
7
+ from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
7
8
 
8
9
  from opengater_globalauth_client.client import GlobalAuthClient
9
10
  from opengater_globalauth_client.models import User
@@ -16,6 +17,10 @@ from opengater_globalauth_client.exceptions import (
16
17
  )
17
18
 
18
19
 
20
+ # Security scheme for Swagger UI
21
+ _security = HTTPBearer(auto_error=False)
22
+
23
+
19
24
  def get_current_user(client: GlobalAuthClient | None = None) -> Callable:
20
25
  """
21
26
  Dependency factory for getting current authenticated user.
@@ -48,7 +53,7 @@ def get_current_user(client: GlobalAuthClient | None = None) -> Callable:
48
53
  """
49
54
  async def dependency(
50
55
  request: Request,
51
- authorization: str | None = Header(None, alias="Authorization"),
56
+ credentials: HTTPAuthorizationCredentials | None = Depends(_security),
52
57
  ) -> User:
53
58
  # Try to get user from middleware first
54
59
  user = getattr(request.state, USER_STATE_KEY, None)
@@ -63,13 +68,13 @@ def get_current_user(client: GlobalAuthClient | None = None) -> Callable:
63
68
  detail="Auth middleware not configured and no client provided"
64
69
  )
65
70
 
66
- if not authorization or not authorization.startswith("Bearer "):
71
+ if not credentials:
67
72
  raise HTTPException(
68
73
  status_code=401,
69
- detail="Authorization header required"
74
+ detail="Authorization required"
70
75
  )
71
76
 
72
- token = authorization[7:]
77
+ token = credentials.credentials
73
78
 
74
79
  try:
75
80
  return await client.introspect(token)
@@ -107,7 +112,7 @@ def get_current_user_optional(client: GlobalAuthClient | None = None) -> Callabl
107
112
  """
108
113
  async def dependency(
109
114
  request: Request,
110
- authorization: str | None = Header(None, alias="Authorization"),
115
+ credentials: HTTPAuthorizationCredentials | None = Depends(_security),
111
116
  ) -> User | None:
112
117
  # Try to get user from middleware
113
118
  user = getattr(request.state, USER_STATE_KEY, None)
@@ -116,14 +121,14 @@ def get_current_user_optional(client: GlobalAuthClient | None = None) -> Callabl
116
121
  return user
117
122
 
118
123
  # No token - that's ok for optional auth
119
- if not authorization or not authorization.startswith("Bearer "):
124
+ if not credentials:
120
125
  return None
121
126
 
122
127
  # Has token - validate it
123
128
  if client is None:
124
129
  return None
125
130
 
126
- token = authorization[7:]
131
+ token = credentials.credentials
127
132
 
128
133
  try:
129
134
  return await client.introspect(token)
@@ -159,13 +164,12 @@ def require_admin(client: GlobalAuthClient | None = None) -> Callable:
159
164
  ...
160
165
  ```
161
166
  """
162
- user_dependency = get_current_user(client)
163
-
164
167
  async def dependency(
165
168
  request: Request,
166
- authorization: str | None = Header(None, alias="Authorization"),
169
+ credentials: HTTPAuthorizationCredentials | None = Depends(_security),
167
170
  ) -> User:
168
- user = await user_dependency(request, authorization)
171
+ user_dep = get_current_user(client)
172
+ user = await user_dep(request, credentials)
169
173
 
170
174
  if not user.is_admin:
171
175
  raise HTTPException(
@@ -192,13 +196,12 @@ def require_verified(client: GlobalAuthClient | None = None) -> Callable:
192
196
  ...
193
197
  ```
194
198
  """
195
- user_dependency = get_current_user(client)
196
-
197
199
  async def dependency(
198
200
  request: Request,
199
- authorization: str | None = Header(None, alias="Authorization"),
201
+ credentials: HTTPAuthorizationCredentials | None = Depends(_security),
200
202
  ) -> User:
201
- user = await user_dependency(request, authorization)
203
+ user_dep = get_current_user(client)
204
+ user = await user_dep(request, credentials)
202
205
 
203
206
  if not user.verified:
204
207
  raise HTTPException(
@@ -209,3 +212,28 @@ def require_verified(client: GlobalAuthClient | None = None) -> Callable:
209
212
  return user
210
213
 
211
214
  return dependency
215
+
216
+
217
+ def get_token() -> Callable:
218
+ """
219
+ Simple dependency to get just the token string.
220
+
221
+ Example:
222
+ ```python
223
+ @app.get("/something")
224
+ async def something(token: str = Depends(get_token())):
225
+ # Use raw token
226
+ ...
227
+ ```
228
+ """
229
+ async def dependency(
230
+ credentials: HTTPAuthorizationCredentials | None = Depends(_security),
231
+ ) -> str:
232
+ if not credentials:
233
+ raise HTTPException(
234
+ status_code=401,
235
+ detail="Authorization required"
236
+ )
237
+ return credentials.credentials
238
+
239
+ return dependency