From a458f816e5e7214745d02170498dc3a94ff99988 Mon Sep 17 00:00:00 2001 From: XiangGao <392041299@qq.com> Date: Fri, 20 Sep 2024 10:18:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8F=90=E4=BE=9Bauthjs=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8BsignIn,=20signOut=E6=96=B9=E6=B3=95=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- playground-authjs/pages/sign-in.vue | 6 ++++- playground-authjs/server/api/auth/[...].ts | 2 +- src/runtime/composables/authjs/use-auth.ts | 31 ++++++++++++++++------ src/runtime/utils/url.ts | 5 ++-- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/playground-authjs/pages/sign-in.vue b/playground-authjs/pages/sign-in.vue index e60917a..feb9ed2 100644 --- a/playground-authjs/pages/sign-in.vue +++ b/playground-authjs/pages/sign-in.vue @@ -27,6 +27,10 @@ const model = ref({ }) const login = async () => { - await signIn('credentials', { ...model.value, redirect: false }) + const result = await signIn('credentials', { ...model.value, redirect: true }) + + if (result) { + console.log(result.error) + } } diff --git a/playground-authjs/server/api/auth/[...].ts b/playground-authjs/server/api/auth/[...].ts index a99c9ad..54525a9 100644 --- a/playground-authjs/server/api/auth/[...].ts +++ b/playground-authjs/server/api/auth/[...].ts @@ -22,7 +22,7 @@ export const options: AuthConfig = { } } - return null + throw new Error('用户名密码错误') }, }), ], diff --git a/src/runtime/composables/authjs/use-auth.ts b/src/runtime/composables/authjs/use-auth.ts index 0589c80..4de8592 100644 --- a/src/runtime/composables/authjs/use-auth.ts +++ b/src/runtime/composables/authjs/use-auth.ts @@ -11,7 +11,13 @@ import { } from '../../utils/url' import { request } from '../../utils/request' import { type SessionData, useAuthState } from './use-auth-state' -import { reloadNuxtApp, useNuxtApp, useRequestHeaders, useRuntimeConfig } from '#imports' +import { + reloadNuxtApp, + useNuxtApp, + useRequestHeaders, + useRequestURL, + useRuntimeConfig, +} from '#imports' /** * 获取设置的 provider 配置对象 @@ -60,12 +66,18 @@ const getSession: GetSession = async (options) => { } type SignInAuthorizationParams = string | string[][] | Record | URLSearchParams +type SignInReturn = Promise<{ + error: string | null + status: number + ok: boolean + url: string | null +} | void> export const signIn = async ( provider?: SupportedProviders, signInOptions: SignOptions = {}, authorizationParams?: SignInAuthorizationParams, -) => { +): SignInReturn => { const nuxtApp = useNuxtApp() // 1. 检查 NuxtAuthHandler providers 策略配置 @@ -90,8 +102,10 @@ export const signIn = async ( let { callbackUrl } = signInOptions if (typeof callbackUrl === 'undefined') { + const requestCallbackUrl = useRequestURL().searchParams.get('callbackUrl') ?? '' + callbackUrl = await nuxtApp.runWithContext(() => - getDefaultCallbackUrl(useRuntimeConfig().public.auth, () => getRequestUrl()), + getDefaultCallbackUrl(useRuntimeConfig().public.auth, () => requestCallbackUrl), ) } @@ -143,8 +157,11 @@ export const signIn = async ( body: params, }) - if (isCredentials && !redirect) { + const error = new URL(response.url).searchParams.get('error') + + if (!error && isCredentials && !redirect) { reloadNuxtApp({ persistState: true, force: true }) + return } if (redirect || !isSupportReturn) { @@ -153,9 +170,6 @@ export const signIn = async ( return await nuxtApp.runWithContext(() => navigateToAuthPage(href)) } - const error = new URL(response.url).searchParams.get('error') - await getSession() - return { error, status: 200, @@ -165,8 +179,9 @@ export const signIn = async ( } type SignOutOptions = Pick +type SignOutReturn = Promise<{ url: string } | void> -const signOut = async (options?: SignOutOptions) => { +const signOut = async (options?: SignOutOptions): SignOutReturn => { const nuxtApp = useNuxtApp() const requestUrl = getRequestUrl() diff --git a/src/runtime/utils/url.ts b/src/runtime/utils/url.ts index da17ca9..d2127a1 100644 --- a/src/runtime/utils/url.ts +++ b/src/runtime/utils/url.ts @@ -9,8 +9,9 @@ import { navigateTo, reloadNuxtApp, useRequestURL, useRuntimeConfig } from '#imp * @param path 路径 * @returns 完整的 auth url */ -export const getAuthApiUrl = (path: string) => - joinURL(useRuntimeConfig().public.auth.params.fullBaseURL, path) +export const getAuthApiUrl = (path: string) => { + return joinURL(useRuntimeConfig().public.auth.params.fullBaseURL, path) +} /** * 获取当前请求的完整 url