django-clerk-users 0.0.1__py3-none-any.whl → 0.1.0__py3-none-any.whl

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 (47) hide show
  1. django_clerk_users/__init__.py +78 -7
  2. django_clerk_users/apps.py +20 -0
  3. django_clerk_users/authentication/__init__.py +24 -0
  4. django_clerk_users/authentication/backends.py +89 -0
  5. django_clerk_users/authentication/drf.py +111 -0
  6. django_clerk_users/authentication/utils.py +171 -0
  7. django_clerk_users/caching.py +161 -0
  8. django_clerk_users/checks.py +127 -0
  9. django_clerk_users/client.py +32 -0
  10. django_clerk_users/decorators.py +181 -0
  11. django_clerk_users/exceptions.py +51 -0
  12. django_clerk_users/management/__init__.py +0 -0
  13. django_clerk_users/management/commands/__init__.py +0 -0
  14. django_clerk_users/management/commands/migrate_users_to_clerk.py +223 -0
  15. django_clerk_users/management/commands/sync_clerk_organizations.py +191 -0
  16. django_clerk_users/management/commands/sync_clerk_users.py +114 -0
  17. django_clerk_users/managers.py +120 -0
  18. django_clerk_users/middleware/__init__.py +9 -0
  19. django_clerk_users/middleware/auth.py +230 -0
  20. django_clerk_users/migrations/0001_initial.py +174 -0
  21. django_clerk_users/migrations/0002_make_clerk_id_nullable.py +24 -0
  22. django_clerk_users/migrations/__init__.py +0 -0
  23. django_clerk_users/models.py +180 -0
  24. django_clerk_users/organizations/__init__.py +8 -0
  25. django_clerk_users/organizations/admin.py +81 -0
  26. django_clerk_users/organizations/apps.py +8 -0
  27. django_clerk_users/organizations/middleware.py +130 -0
  28. django_clerk_users/organizations/migrations/0001_initial.py +349 -0
  29. django_clerk_users/organizations/migrations/__init__.py +0 -0
  30. django_clerk_users/organizations/models.py +314 -0
  31. django_clerk_users/organizations/webhooks.py +417 -0
  32. django_clerk_users/settings.py +37 -0
  33. django_clerk_users/testing.py +381 -0
  34. django_clerk_users/utils.py +210 -0
  35. django_clerk_users/webhooks/__init__.py +26 -0
  36. django_clerk_users/webhooks/handlers.py +346 -0
  37. django_clerk_users/webhooks/security.py +108 -0
  38. django_clerk_users/webhooks/signals.py +42 -0
  39. django_clerk_users/webhooks/views.py +76 -0
  40. django_clerk_users-0.1.0.dist-info/METADATA +311 -0
  41. django_clerk_users-0.1.0.dist-info/RECORD +43 -0
  42. {django_clerk_users-0.0.1.dist-info → django_clerk_users-0.1.0.dist-info}/WHEEL +1 -2
  43. django_clerk_users/main.py +0 -2
  44. django_clerk_users-0.0.1.dist-info/METADATA +0 -24
  45. django_clerk_users-0.0.1.dist-info/RECORD +0 -7
  46. django_clerk_users-0.0.1.dist-info/top_level.txt +0 -1
  47. {django_clerk_users-0.0.1.dist-info → django_clerk_users-0.1.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,311 @@
1
+ Metadata-Version: 2.4
2
+ Name: django-clerk-users
3
+ Version: 0.1.0
4
+ Summary: Integrate Clerk with Django
5
+ Project-URL: Changelog, https://github.com/jmitchel3/django-clerk-users
6
+ Project-URL: Documentation, https://github.com/jmitchel3/django-clerk-users
7
+ Project-URL: Funding, https://github.com/jmitchel3/django-clerk-users
8
+ Project-URL: Repository, https://github.com/jmitchel3/django-clerk-users
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Framework :: Django
12
+ Classifier: Framework :: Django :: 4.2
13
+ Classifier: Programming Language :: Python :: 3 :: Only
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Requires-Python: >=3.12
18
+ Requires-Dist: clerk-backend-api>=1.0.0
19
+ Requires-Dist: django>=4.2
20
+ Requires-Dist: svix>=1.0.0
21
+ Provides-Extra: drf
22
+ Requires-Dist: djangorestframework>=3.14; extra == 'drf'
23
+ Description-Content-Type: text/markdown
24
+
25
+ # Django Clerk Users
26
+
27
+ Integrate [Clerk](https://clerk.com) authentication with Django.
28
+
29
+ > **Note:** This package is in early development (v0.0.2). APIs may change.
30
+
31
+ ## Features
32
+
33
+ - Custom user model (`ClerkUser`) with Clerk integration
34
+ - JWT token validation via Clerk SDK
35
+ - Session-based authentication middleware (validates once, caches in session)
36
+ - Webhook handling with Svix signature verification
37
+ - Optional organizations support (separate sub-app)
38
+ - Django REST Framework authentication (optional)
39
+
40
+ ## Installation
41
+
42
+ ```bash
43
+ pip install django-clerk-users
44
+ ```
45
+
46
+ For Django REST Framework support:
47
+
48
+ ```bash
49
+ pip install django-clerk-users[drf]
50
+ ```
51
+
52
+ ## Quick Start
53
+
54
+ ### 1. Add to installed apps
55
+
56
+ ```python
57
+ INSTALLED_APPS = [
58
+ # ...
59
+ "django_clerk_users",
60
+ # Optional: for organization support
61
+ # "django_clerk_users.organizations",
62
+ ]
63
+ ```
64
+
65
+ ### 2. Configure settings
66
+
67
+ ```python
68
+ # Required
69
+ CLERK_SECRET_KEY = "sk_live_..." # From Clerk Dashboard
70
+ CLERK_WEBHOOK_SIGNING_KEY = "whsec_..." # From Clerk Webhooks
71
+ CLERK_FRONTEND_HOSTS = ["https://your-app.com"] # Your frontend URLs
72
+
73
+ # Optional
74
+ CLERK_SESSION_REVALIDATION_SECONDS = 300 # Re-validate JWT every 5 minutes
75
+ CLERK_CACHE_TIMEOUT = 300 # Cache timeout for user lookups
76
+ ```
77
+
78
+ ### 3. Set the user model
79
+
80
+ ```python
81
+ AUTH_USER_MODEL = "django_clerk_users.ClerkUser"
82
+ ```
83
+
84
+ Or extend the abstract model for custom fields:
85
+
86
+ ```python
87
+ # myapp/models.py
88
+ from django_clerk_users.models import AbstractClerkUser
89
+
90
+ class CustomUser(AbstractClerkUser):
91
+ company = models.CharField(max_length=255, blank=True)
92
+
93
+ class Meta(AbstractClerkUser.Meta):
94
+ swappable = "AUTH_USER_MODEL"
95
+
96
+ # settings.py
97
+ AUTH_USER_MODEL = "myapp.CustomUser"
98
+ ```
99
+
100
+ ### 4. Add middleware
101
+
102
+ ```python
103
+ MIDDLEWARE = [
104
+ "django.middleware.security.SecurityMiddleware",
105
+ "django.contrib.sessions.middleware.SessionMiddleware",
106
+ "django.middleware.common.CommonMiddleware",
107
+ "django.middleware.csrf.CsrfViewMiddleware",
108
+ "django.contrib.auth.middleware.AuthenticationMiddleware",
109
+ "django_clerk_users.middleware.ClerkAuthMiddleware", # Add after AuthenticationMiddleware
110
+ # ...
111
+ ]
112
+ ```
113
+
114
+ ### 5. Add authentication backend
115
+
116
+ **For Clerk-only authentication:**
117
+
118
+ ```python
119
+ AUTHENTICATION_BACKENDS = [
120
+ "django_clerk_users.authentication.ClerkBackend",
121
+ ]
122
+ ```
123
+
124
+ **For hybrid authentication (Clerk + Django admin):**
125
+
126
+ If you want to support both Clerk authentication (JWT) and traditional Django admin login (username/password), use both backends:
127
+
128
+ ```python
129
+ AUTHENTICATION_BACKENDS = [
130
+ "django.contrib.auth.backends.ModelBackend", # For Django admin
131
+ "django_clerk_users.authentication.ClerkBackend", # For Clerk JWT
132
+ ]
133
+ ```
134
+
135
+ This allows:
136
+ - Admin users to log in via Django admin with username/password
137
+ - Frontend users to authenticate via Clerk JWT tokens
138
+ - The middleware automatically detects which authentication method was used
139
+
140
+ ### 6. Run migrations
141
+
142
+ ```bash
143
+ python manage.py migrate
144
+ ```
145
+
146
+ ### 7. Configure webhooks
147
+
148
+ Add the webhook URL to your `urls.py`:
149
+
150
+ ```python
151
+ from django_clerk_users.webhooks import clerk_webhook_view
152
+
153
+ urlpatterns = [
154
+ # ...
155
+ path("webhooks/clerk/", clerk_webhook_view, name="clerk_webhook"),
156
+ ]
157
+ ```
158
+
159
+ Then configure your Clerk Dashboard to send webhooks to `https://your-app.com/webhooks/clerk/`.
160
+
161
+ ### 8. Create admin users (for hybrid authentication)
162
+
163
+ If you're using hybrid authentication, create an admin user for Django admin access:
164
+
165
+ ```bash
166
+ python manage.py createsuperuser
167
+ ```
168
+
169
+ This creates a user with:
170
+ - Username/password authentication (for Django admin)
171
+ - No `clerk_id` (since they're not Clerk users)
172
+ - Access to Django admin panel
173
+
174
+ Note: Regular Clerk users are created automatically via webhooks when they sign up through your frontend.
175
+
176
+ ## Usage
177
+
178
+ ### Accessing the user in views
179
+
180
+ ```python
181
+ def my_view(request):
182
+ if request.user.is_authenticated:
183
+ # Access Clerk user attributes
184
+ print(request.user.clerk_id)
185
+ print(request.user.email)
186
+ print(request.user.full_name)
187
+
188
+ # Access organization (if using organizations)
189
+ print(request.org) # Organization ID from JWT
190
+ ```
191
+
192
+ ### Decorators
193
+
194
+ ```python
195
+ from django_clerk_users.decorators import clerk_user_required
196
+
197
+ @clerk_user_required
198
+ def protected_view(request):
199
+ # Only authenticated Clerk users can access
200
+ return HttpResponse(f"Hello, {request.user.email}")
201
+ ```
202
+
203
+ ### Django REST Framework
204
+
205
+ ```python
206
+ # settings.py
207
+ REST_FRAMEWORK = {
208
+ "DEFAULT_AUTHENTICATION_CLASSES": [
209
+ "django_clerk_users.authentication.ClerkAuthentication",
210
+ ],
211
+ }
212
+ ```
213
+
214
+ ## Hybrid Authentication (Clerk + Django Admin)
215
+
216
+ The package supports hybrid authentication, allowing you to use both Clerk (JWT-based) authentication for your frontend users and traditional Django admin authentication for internal staff.
217
+
218
+ ### How it works
219
+
220
+ 1. **Frontend users**: Authenticate via Clerk JWT tokens (handled by `ClerkAuthMiddleware`)
221
+ 2. **Admin users**: Authenticate via username/password (handled by Django's `ModelBackend`)
222
+ 3. The middleware automatically detects which authentication method was used and respects existing sessions
223
+
224
+ ### Configuration
225
+
226
+ ```python
227
+ # settings.py
228
+ AUTHENTICATION_BACKENDS = [
229
+ "django.contrib.auth.backends.ModelBackend", # For Django admin
230
+ "django_clerk_users.authentication.ClerkBackend", # For Clerk JWT
231
+ ]
232
+ ```
233
+
234
+ ### Creating admin users
235
+
236
+ Admin users don't need a `clerk_id` (it's optional in hybrid mode):
237
+
238
+ ```bash
239
+ python manage.py createsuperuser
240
+ # Email: admin@example.com
241
+ # Password: ********
242
+ ```
243
+
244
+ This creates a user with:
245
+ - Username/password authentication (no Clerk integration)
246
+ - Access to Django admin panel at `/admin/`
247
+ - Standard Django permissions (is_staff, is_superuser)
248
+
249
+ ### Session handling
250
+
251
+ - **Django admin sessions**: Traditional session cookies (set by Django's auth system)
252
+ - **Clerk sessions**: JWT validated once, then cached in session with `last_clerk_check` marker
253
+ - The middleware checks for `last_clerk_check` to distinguish between the two types
254
+
255
+ ### Use cases
256
+
257
+ This is particularly useful when:
258
+ - Your admin panel is on a different domain than your frontend
259
+ - You want internal staff to access Django admin without Clerk accounts
260
+ - You need traditional Django auth features (permissions, groups, etc.)
261
+ - You're migrating from Django auth to Clerk gradually
262
+
263
+ ## Organizations (Optional)
264
+
265
+ For Clerk organization support:
266
+
267
+ ```python
268
+ # settings.py
269
+ INSTALLED_APPS = [
270
+ # ...
271
+ "django_clerk_users",
272
+ "django_clerk_users.organizations",
273
+ ]
274
+
275
+ MIDDLEWARE = [
276
+ # ...
277
+ "django_clerk_users.middleware.ClerkAuthMiddleware",
278
+ "django_clerk_users.organizations.middleware.ClerkOrganizationMiddleware",
279
+ ]
280
+ ```
281
+
282
+ ## Management Commands
283
+
284
+ ```bash
285
+ # Sync users from Clerk
286
+ python manage.py sync_clerk_users
287
+
288
+ # Sync organizations from Clerk
289
+ python manage.py sync_clerk_organizations
290
+ ```
291
+
292
+ ## Configuration Reference
293
+
294
+ | Setting | Required | Default | Description |
295
+ |---------|----------|---------|-------------|
296
+ | `CLERK_SECRET_KEY` | Yes | - | Your Clerk secret key |
297
+ | `CLERK_WEBHOOK_SIGNING_KEY` | Yes* | - | Webhook signing secret (*required for webhooks) |
298
+ | `CLERK_FRONTEND_HOSTS` | Yes | `[]` | Authorized frontend URLs |
299
+ | `CLERK_AUTH_PARTIES` | No | `[]` | Alias for `CLERK_FRONTEND_HOSTS` |
300
+ | `CLERK_SESSION_REVALIDATION_SECONDS` | No | `300` | JWT revalidation interval (seconds) |
301
+ | `CLERK_CACHE_TIMEOUT` | No | `300` | User cache timeout (seconds) |
302
+ | `CLERK_ORG_CACHE_TIMEOUT` | No | `900` | Organization cache timeout (seconds) |
303
+ | `CLERK_WEBHOOK_DEDUP_TIMEOUT` | No | `45` | Webhook deduplication cache timeout (seconds) |
304
+
305
+ ## License
306
+
307
+ MIT
308
+
309
+ ## Contributing
310
+
311
+ Contributions are welcome! Please open an issue or PR on [GitHub](https://github.com/jmitchel3/django-clerk-users).
@@ -0,0 +1,43 @@
1
+ django_clerk_users/__init__.py,sha256=Ph93iT6_RNdZej3GM6cez-cJjiXw6w1V-u4GCnGP8TY,2287
2
+ django_clerk_users/apps.py,sha256=upj0qWYVg4P2D6_Vt8QZWTfBpAdIP7EAQjVjEnfHLRA,729
3
+ django_clerk_users/caching.py,sha256=QXRd9cFvvUucrnLBd7_PId3xDodqcessDMybkHyskkU,4651
4
+ django_clerk_users/checks.py,sha256=gnHccAyXixtGToGhgWl4gfCY-qPB5ckimpDVadOP3E4,4191
5
+ django_clerk_users/client.py,sha256=-nBXsPOibVwD7zXQ-Z-qTBb7NyPuUZpvlDcAlDVFUBA,815
6
+ django_clerk_users/decorators.py,sha256=Hm86XIxNdSiuDmqT8tFRrz6sQR9IOxB7zfxfO8MeJLg,5011
7
+ django_clerk_users/exceptions.py,sha256=nVTJR1d5PxuMqC8js1Sj-MRHJHkI4KUwphjuCEN4fiM,890
8
+ django_clerk_users/managers.py,sha256=HvSkGeiQhjA6EFXrW4GTlxXtlRDtlT54BbwbvnNuOWg,3610
9
+ django_clerk_users/models.py,sha256=DMcEnGNioGX5xsP4U47ich1L_UoZNAFEDb-vZVVV8Tk,5210
10
+ django_clerk_users/settings.py,sha256=pRyt_kSPWOT8CkTvyce3sf0RxfIoG5DEwnGUT8bIDi8,1305
11
+ django_clerk_users/testing.py,sha256=ZoYi7dG_HjSp19_c1AvILOoCfHlofs7LN-5ALS_UhDw,12160
12
+ django_clerk_users/utils.py,sha256=bQWfPUKfVvXi69Ctny1T1Kxzk-qMDpXQBRVa6URH53I,5886
13
+ django_clerk_users/authentication/__init__.py,sha256=PStQVzC-CA2Guyo4ksrxP58o93mfygW4qcJXWEjs6ak,614
14
+ django_clerk_users/authentication/backends.py,sha256=We0P2AhMv_DB_ZwtFGmmjWKvT5Cewy441Iua2lAZZCg,2400
15
+ django_clerk_users/authentication/drf.py,sha256=AqHvZTe9RnxN7FVzlSUXR72QBj2imGglkx9rpOrRDIk,3215
16
+ django_clerk_users/authentication/utils.py,sha256=tpnRXQLbQPkosKV8OhxtXpapuema4c08g58YYmMl3js,5326
17
+ django_clerk_users/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ django_clerk_users/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ django_clerk_users/management/commands/migrate_users_to_clerk.py,sha256=qjw4Q6pU7-4Tt7XourTzCw7IBm5kkOau4mPkW2Vz13E,8047
20
+ django_clerk_users/management/commands/sync_clerk_organizations.py,sha256=G1kasAPvvwM-PPb5xXxKNlex_-gWyKDP2HLS5g8hVkk,6656
21
+ django_clerk_users/management/commands/sync_clerk_users.py,sha256=hvWrvcqAkZHvjqQAOj3-e6pKx5TKtArmlsHDUottRMM,3755
22
+ django_clerk_users/middleware/__init__.py,sha256=tnr4eBer0KGVBAZBgBQZVpcL7jf8t2_CBLsMnau5JW4,153
23
+ django_clerk_users/middleware/auth.py,sha256=FLo4DHkiL3QnEPZsvJDGFIahfH1HUcqkBEzYXEx0fN0,8889
24
+ django_clerk_users/migrations/0001_initial.py,sha256=tnPvGlLnWrItuhYS0s5mr3TJ8__2e_yNKJS4nsFuWhk,6246
25
+ django_clerk_users/migrations/0002_make_clerk_id_nullable.py,sha256=OXad63KPFTMLn2lkwkuNkr8ZbM6BiNlsw6z72fhY-eU,640
26
+ django_clerk_users/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ django_clerk_users/organizations/__init__.py,sha256=NZU2C8F4Trm63_qaUf78jROKz6XFnu36uREkw7g_yho,270
28
+ django_clerk_users/organizations/admin.py,sha256=u7qHMgb11akHiJ2FCzqbSLQ3_TsTiejf0wH10f5_PPQ,1838
29
+ django_clerk_users/organizations/apps.py,sha256=IgKNl5REkAgLDHC06GFI-a3x3Mi2HWN4L-El0Ef6CE8,252
30
+ django_clerk_users/organizations/middleware.py,sha256=5Gvu28SCEqpuIjr2Fah5O85m0wnjMiDp4vxdvVzJh68,4129
31
+ django_clerk_users/organizations/models.py,sha256=rGy3udfo2xO6XBMPHS7eTTk9meyxx_3GI9zL9lH-ScY,8602
32
+ django_clerk_users/organizations/webhooks.py,sha256=zp16_vL5j7DEaVC5ZxgYwrE8zPpUsRIq8TGBd8SYhoo,14321
33
+ django_clerk_users/organizations/migrations/0001_initial.py,sha256=NXZ63PLqkX0ebavvLk6aHOffiFDq0pZamEelb6PG4Yg,12625
34
+ django_clerk_users/organizations/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ django_clerk_users/webhooks/__init__.py,sha256=XlpsPmc_lHQkZVMeuXce_2hsq7WZzXOXNy36kiQA5Lk,558
36
+ django_clerk_users/webhooks/handlers.py,sha256=GnotJNhN809DsrbfZjtJD0KurThKyAXZS982a41ljwg,9457
37
+ django_clerk_users/webhooks/security.py,sha256=Ig2ZxF8SxX5o-4bNRehFhip4hVvcQxoGsTj3sTY3WSU,3461
38
+ django_clerk_users/webhooks/signals.py,sha256=bytshg7IMDnlvnCZ0_TGjUXZZLRNxtn2RSx97qacZ-w,1668
39
+ django_clerk_users/webhooks/views.py,sha256=0-ilzzO7tBfc-pENMy0ZSSkQ4uPqH2QAt249EK2wQKA,2287
40
+ django_clerk_users-0.1.0.dist-info/METADATA,sha256=JSE1da_-Xl_lXQimkztPbpz1bY4MF45wkQY2K49U75E,8687
41
+ django_clerk_users-0.1.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
42
+ django_clerk_users-0.1.0.dist-info/licenses/LICENSE,sha256=X4PZDRQG4RmPhHU5c0G21Ki9LXWDCuLQ8W4mnED5RDU,1071
43
+ django_clerk_users-0.1.0.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
-
@@ -1,2 +0,0 @@
1
- def hello_world():
2
- return "Hello from django-clerk-users!"
@@ -1,24 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: django-clerk-users
3
- Version: 0.0.1
4
- Summary: Integrate Clerk with Django
5
- Project-URL: Changelog, https://github.com/jmitchel3/django-clerk-users
6
- Project-URL: Documentation, https://github.com/jmitchel3/django-clerk-users
7
- Project-URL: Funding, https://github.com/jmitchel3/django-clerk-users
8
- Project-URL: Repository, https://github.com/jmitchel3/django-clerk-users
9
- Classifier: Development Status :: 4 - Beta
10
- Classifier: Framework :: Django
11
- Classifier: Framework :: Django :: 4.2
12
- Classifier: Programming Language :: Python :: 3 :: Only
13
- Classifier: Programming Language :: Python :: 3.12
14
- Classifier: Programming Language :: Python :: 3.13
15
- Classifier: Programming Language :: Python :: 3.14
16
- Requires-Python: >=3.12
17
- Description-Content-Type: text/markdown
18
- License-File: LICENSE
19
- Requires-Dist: django>=4.2
20
- Dynamic: license-file
21
-
22
- # Django Clerk Users
23
-
24
- Integrate Clerk with Django, coming soon.
@@ -1,7 +0,0 @@
1
- django_clerk_users/__init__.py,sha256=L_pMt2_tM2dlDpsSo12M-kG_qW6TlMCr-sk0KMfKAxE,549
2
- django_clerk_users/main.py,sha256=RfM09MvG3C2hmAH5l0RM-lbYatU_58RmkEpjrHtE2BM,63
3
- django_clerk_users-0.0.1.dist-info/licenses/LICENSE,sha256=X4PZDRQG4RmPhHU5c0G21Ki9LXWDCuLQ8W4mnED5RDU,1071
4
- django_clerk_users-0.0.1.dist-info/METADATA,sha256=S8sFVa0UAXvgXnLdmBLrD7QXzR7Tubn76v7cnqyrn3c,913
5
- django_clerk_users-0.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
6
- django_clerk_users-0.0.1.dist-info/top_level.txt,sha256=m2CUZNVRrrVHorKdGlRLuGJbc0NFgx1f2GGjpTLuGXY,19
7
- django_clerk_users-0.0.1.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- django_clerk_users