Linkwarden + OAuth = Unique constraint failed on the fields: (`username`)
Describe your question/ Linkwarden doesnt allow me to login or signup with authentik
Relevant info Linkwarden Docker 2.7.1 Authentik Docker 2024.8.3
Screenshots If applicable, add screenshots to help explain your problem.
Logs
LInkwarden log:
First an last message might not be relevant to this.
2024-10-13T12:14:30.264575524Z [0] prisma:query SELECT "public"."Account"."id", "public"."Account"."userId", "public"."Account"."type", "public"."Account"."provider", "public"."Account"."providerAccountId", "public"."Account"."refresh_token", "public"."Account"."access_token", "public"."Account"."expires_at", "public"."Account"."token_type", "public"."Account"."scope", "public"."Account"."id_token", "public"."Account"."session_state" FROM "public"."Account" WHERE "public"."Account"."providerAccountId" = $1 LIMIT $2 OFFSET $3
2024-10-13T12:14:30.266052554Z [0] prisma:query SELECT "public"."Account"."id", "public"."Account"."userId" FROM "public"."Account" WHERE (("public"."Account"."provider" = $1 AND "public"."Account"."providerAccountId" = $2) AND 1=1) LIMIT $3 OFFSET $4
2024-10-13T12:14:30.273785404Z [0] prisma:query SELECT "public"."User"."id", "public"."User"."name", "public"."User"."username", "public"."User"."email", "public"."User"."emailVerified", "public"."User"."unverifiedNewEmail", "public"."User"."image", "public"."User"."password", "public"."User"."locale", "public"."User"."collectionOrder", "public"."User"."linksRouteTo", "public"."User"."preventDuplicateLinks", "public"."User"."archiveAsScreenshot", "public"."User"."archiveAsMonolith", "public"."User"."archiveAsPDF", "public"."User"."archiveAsWaybackMachine", "public"."User"."isPrivate", "public"."User"."createdAt", "public"."User"."updatedAt" FROM "public"."User" WHERE ("public"."User"."email" = $1 AND 1=1) LIMIT $2 OFFSET $3
2024-10-13T12:14:30.275060049Z [0] prisma:query BEGIN
2024-10-13T12:14:30.276289605Z [0] prisma:query INSERT INTO "public"."User" ("name","username","email","emailVerified","locale","collectionOrder","linksRouteTo","preventDuplicateLinks","archiveAsScreenshot","archiveAsMonolith","archiveAsPDF","archiveAsWaybackMachine","isPrivate","createdAt","updatedAt") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15) RETURNING "public"."User"."id"
2024-10-13T12:14:30.276410502Z [0] prisma:query ROLLBACK
2024-10-13T12:14:30.276897989Z [0] [next-auth][error][adapter_error_createUser]
2024-10-13T12:14:30.276905791Z [0] https://next-auth.js.org/errors#adapter_error_createuser
2024-10-13T12:14:30.276908271Z [0] Invalid `prisma.user.create()` invocation:
2024-10-13T12:14:30.276910580Z | 0=0
2024-10-13T12:14:30.276912440Z | 0=0
2024-10-13T12:14:30.276914123Z [0] Unique constraint failed on the fields: (`username`) {
2024-10-13T12:14:30.276916010Z [0] message: '\n' +
2024-10-13T12:14:30.276918064Z [0] 'Invalid `prisma.user.create()` invocation:\n' +
2024-10-13T12:14:30.276920046Z [0] '\n' +
2024-10-13T12:14:30.276921870Z [0] '\n' +
2024-10-13T12:14:30.276923913Z [0] 'Unique constraint failed on the fields: (`username`)',
2024-10-13T12:14:30.276925988Z [0] stack: 'PrismaClientKnownRequestError: \n' +
2024-10-13T12:14:30.276927827Z [0] 'Invalid `prisma.user.create()` invocation:\n' +
2024-10-13T12:14:30.276929663Z [0] '\n' +
2024-10-13T12:14:30.276931489Z [0] '\n' +
2024-10-13T12:14:30.276933240Z [0] 'Unique constraint failed on the fields: (`username`)\n' +
2024-10-13T12:14:30.276935090Z [0] ' at Rn.handleRequestError (/data/node_modules/@prisma/client/runtime/library.js:174:7325)\n' +
2024-10-13T12:14:30.276937002Z [0] ' at Rn.handleAndLogRequestError (/data/node_modules/@prisma/client/runtime/library.js:174:6754)\n' +
2024-10-13T12:14:30.276948231Z [0] ' at Rn.request (/data/node_modules/@prisma/client/runtime/library.js:174:6344)',
2024-10-13T12:14:30.276950392Z [0] name: 'PrismaClientKnownRequestError'
2024-10-13T12:14:30.276952279Z [0] }
2024-10-13T12:14:35.625804388Z [1] prisma:query SELECT 1
2024-10-13T12:14:35.625825009Z [1] prisma:query SELECT "public"."Link"."id", "public"."Link"."name", "public"."Link"."type", "public"."Link"."description", "public"."Link"."collectionId", "public"."Link"."url", "public"."Link"."textContent", "public"."Link"."preview", "public"."Link"."image", "public"."Link"."pdf", "public"."Link"."readable", "public"."Link"."monolith", "public"."Link"."lastPreserved", "public"."Link"."importDate", "public"."Link"."createdAt", "public"."Link"."updatedAt" FROM "public"."Link" WHERE ("public"."Link"."url" IS NOT NULL AND ("public"."Link"."image" IS NULL OR "public"."Link"."image" = $1 OR "public"."Link"."pdf" IS NULL OR "public"."Link"."pdf" = $2 OR "public"."Link"."readable" IS NULL OR "public"."Link"."readable" = $3 OR "public"."Link"."monolith" IS NULL OR "public"."Link"."monolith" = $4)) ORDER BY "public"."Link"."id" ASC LIMIT $5 OFFSET $6
Authentik log:
2024-10-13T12:17:11.573486727Z INF | domain_url=null event=Task started logger=authentik.root.celery pid=2306 schema_name=public task_id=597ce21b-91c3-4172-802d-d49ef8ca7a50 task_name=event_notification_handler timestamp=2024-10-13T12:17:11.572897
2024-10-13T12:17:11.594277018Z INF | domain_url=null event=Task published logger=authentik.root.celery pid=2306 schema_name=public task_id=4965efd1d2784bd39b1ca699607481e5 task_name=authentik.events.tasks.event_trigger_handler timestamp=2024-10-13T12:17:11.594093
2024-10-13T12:17:11.595492765Z INF | domain_url=null event=Task published logger=authentik.root.celery pid=2306 schema_name=public task_id=93fb44278fa242849c4b4cc3ed606a05 task_name=authentik.events.tasks.event_trigger_handler timestamp=2024-10-13T12:17:11.595334
2024-10-13T12:17:11.596601743Z INF | domain_url=null event=Task published logger=authentik.root.celery pid=2306 schema_name=public task_id=494a251380e148ffa4013f9cca0a7ad4 task_name=authentik.events.tasks.event_trigger_handler timestamp=2024-10-13T12:17:11.596443
2024-10-13T12:17:11.597544319Z INF | domain_url=null event=Task finished logger=authentik.root.celery pid=2306 schema_name=public state=SUCCESS task_id=597ce21b91c34172802dd49ef8ca7a50 task_name=event_notification_handler timestamp=2024-10-13T12:17:11.597387
2024-10-13T12:17:11.811632211Z INF | domain_url=null event=Task started logger=authentik.root.celery pid=2306 schema_name=public task_id=4965efd1-d278-4bd3-9b1c-a699607481e5 task_name=event_trigger_handler timestamp=2024-10-13T12:17:11.811435
2024-10-13T12:17:11.848627862Z INF | domain_url=null event=Task started logger=authentik.root.celery pid=2388 schema_name=public task_id=93fb4427-8fa2-4284-9c4b-4cc3ed606a05 task_name=event_trigger_handler timestamp=2024-10-13T12:17:11.848210
2024-10-13T12:17:11.850206637Z INF | domain_url=null event=Task finished logger=authentik.root.celery pid=2306 schema_name=public state=SUCCESS task_id=4965efd1d2784bd39b1ca699607481e5 task_name=event_trigger_handler timestamp=2024-10-13T12:17:11.850023
2024-10-13T12:17:11.855333729Z INF | domain_url=null event=Task started logger=authentik.root.celery pid=2306 schema_name=public task_id=494a2513-80e1-48ff-a401-3f9cca0a7ad4 task_name=event_trigger_handler timestamp=2024-10-13T12:17:11.854658
2024-10-13T12:17:11.897181657Z INF | domain_url=null event=Task finished logger=authentik.root.celery pid=2306 schema_name=public state=SUCCESS task_id=494a251380e148ffa4013f9cca0a7ad4 task_name=event_trigger_handler timestamp=2024-10-13T12:17:11.896980
2024-10-13T12:17:11.899652064Z INF | domain_url=null event=Task finished logger=authentik.root.celery pid=2388 schema_name=public state=SUCCESS task_id=93fb44278fa242849c4b4cc3ed606a05 task_name=event_trigger_handler timestamp=2024-10-13T12:17:11.898502
Version and Deployment (please complete the following information):
- authentik version: 2024.8.3
- Deployment: docker-compose
Additional context Linkwarden doesn't have issues login and sign up normally (without authentik)
Knowing kinda nothing I thought might have to do with this Provider - Preview - JWT payload
{
"iss": "https://domain.example.com/application/o/linkwarden/",
"sub": "longthing1",
"aud": "longthing2",
"exp": numbers,
"iat": numbers,
"auth_time": 1728822012,
"acr": "goauthentik.io/providers/oauth2/default",
"amr": [
"pwd",
"mfa"
],
"email": "[email protected]",
"email_verified": true,
"name": "Foobar",
"given_name": "Foobar",
"preferred_username": "Foobar",
"nickname": "Foobar",
"groups": []
}
since it doesnt have a "username" field, onl preferred_username.
If this is something wrong in linkwarden or its dependencies I wouldn't mind opening and issue there, but in the meantime I would like to know to work around it
from what I see on my end this is a conflict in the database where it's trying to create the user via oidc despite a user with the same username existing
no idea how to fix it except doing the dance of setting up an alt admin account, exporting my current one then deleting it, sso to create newold account, importing everything back
I worked this out. My user in LinkWarden did not have an email address attached. Once I put the email address in the table, Authentik logged me in no problem.
- Get your user's
id - Add email address or update it to your correct one.
postgres=# SELECT * from "User";
id | name | username | email | emailVerified | password | isPrivate | createdAt | archiveAsPDF | archiveAsScreenshot | archiveAsWaybackMachine | image | updatedAt | linksRouteTo | collectionOrder | preventDuplicateLinks | unverifiedNewEmail | locale | archiveAsMonolith | parentSubscriptionId | referredBy | aiPredefinedTags | aiTaggingMethod | dashboardPinnedLinks | dashboardRecentLinks | aiTagExistingLinks | archiveAsReadable
----+-----------+----------+------------------------+---------------+--------------------------------------------------------------+-----------+-------------------------+--------------+---------------------+-------------------------+----------------------+-------------------------+--------------+---------------------+-----------------------+--------------------+--------+-------------------+----------------------+------------+------------------+-----------------+----------------------+----------------------+--------------------+-------------------
1 | MyName | username | | | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | f | 2025-06-03 20:40:21.005 | t | t | f | uploads/avatar/1.jpg | 2025-06-05 01:00:47.359 | ORIGINAL | {1,2,3,4,5,6,7,8,9} | t | | en | t | | | {} | DISABLED | t | t | f | t
postgres=# update "User" SET email = '[email protected]' WHERE id = 1;
UPDATE 1
I did this after connecting to the postgres docker container and logging in as the postgres user with the credentials from my .env file.