From d0834f2b204eba2ac4eed60e7740370d5e21d3fd Mon Sep 17 00:00:00 2001 From: evlic Date: Wed, 12 Aug 2026 06:22:28 +0800 Subject: [PATCH] feat(auth): add OIDC member authentication --- client/src/components/avatar.vue | 33 +- client/src/components/chat.vue | 7 +- client/src/components/connect.vue | 70 ++- client/src/components/context.vue | 7 +- client/src/components/members.vue | 4 +- client/src/neko/types.ts | 1 + server/cmd/serve.go | 3 + server/internal/api/oauth.go | 489 ++++++++++++++++++ server/internal/api/oauth_test.go | 241 +++++++++ server/internal/api/router.go | 17 + server/internal/api/session.go | 16 +- server/internal/config/member.go | 146 ++++++ server/internal/http/legacy/handler.go | 9 +- server/internal/http/legacy/session.go | 39 +- server/internal/http/legacy/session_test.go | 63 +++ server/internal/http/legacy/types/types.go | 9 +- server/internal/http/legacy/wstoclient.go | 22 +- .../internal/http/legacy/wstoclient_test.go | 20 + server/internal/http/manager.go | 50 +- server/internal/http/manager_test.go | 68 +++ server/internal/member/manager.go | 99 +++- server/internal/member/oauth/provider.go | 45 ++ server/internal/session/auth.go | 11 +- server/pkg/types/api.go | 3 + server/pkg/types/member.go | 5 +- 25 files changed, 1415 insertions(+), 62 deletions(-) create mode 100644 server/internal/api/oauth.go create mode 100644 server/internal/api/oauth_test.go create mode 100644 server/internal/http/legacy/session_test.go create mode 100644 server/internal/http/legacy/wstoclient_test.go create mode 100644 server/internal/http/manager_test.go create mode 100644 server/internal/member/oauth/provider.go diff --git a/client/src/components/avatar.vue b/client/src/components/avatar.vue index abe7c115..90e21d6d 100644 --- a/client/src/components/avatar.vue +++ b/client/src/components/avatar.vue @@ -12,7 +12,8 @@ backgroundColor: Background(seed), }" > - {{ seed.substring(0, 2).toUpperCase() }} + + @@ -25,19 +26,47 @@ display: inline-block; overflow: hidden; border-radius: 50%; + + img { + width: 100%; + height: 100%; + display: block; + object-fit: cover; + } }