feat(oauth): Implement OAuth token retrieval and refactor login callback handling

This commit is contained in:
web@ppanel 2025-01-21 23:32:12 +07:00
parent 8346c85109
commit 40a6f7ca81
5 changed files with 51 additions and 23 deletions

View File

@ -79,3 +79,18 @@ export async function oAuthLogin(body: API.OAthLoginRequest, options?: { [key: s
...(options || {}),
});
}
/** OAuth login get token POST /v1/auth/oauth/login/token */
export async function oAuthLoginGetToken(
body: API.OAuthLoginGetTokenRequest,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.LoginResponse }>('/v1/auth/oauth/login/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@ -231,6 +231,12 @@ declare namespace API {
redirect: string;
};
type OAuthLoginGetTokenRequest = {
/** google, facebook, apple, telegram, github etc. */
method: string;
code: string;
};
type OAuthLoginResponse = {
redirect: string;
};

View File

@ -1,11 +1,6 @@
'use client';
import {
appleLoginCallback,
facebookLoginCallback,
googleLoginCallback,
telegramLoginCallback,
} from '@/services/common/oauth';
import { oAuthLoginGetToken } from '@/services/common/oauth';
import { getRedirectUrl, setAuthorization } from '@/utils/common';
import { useRouter, useSearchParams } from 'next/navigation';
import { useEffect } from 'react';
@ -19,26 +14,16 @@ export default function Certification({ platform, children }: CertificationProps
const searchParams = useSearchParams();
const router = useRouter();
async function LoginCallback() {
const body = Object.fromEntries(searchParams.entries()) as any;
switch (platform) {
case 'apple':
return appleLoginCallback(body);
case 'facebook':
return facebookLoginCallback(body);
case 'google':
return googleLoginCallback(body);
case 'telegram':
// 回调参数是 # 开头的,需要去掉
return telegramLoginCallback(body);
default:
break;
}
}
useEffect(() => {
LoginCallback()
oAuthLoginGetToken({
method: platform,
code: searchParams.get('code') || '',
})
.then((res) => {
const token = res?.data?.data?.token;
if (!token) {
throw new Error('Invalid token');
}
setAuthorization(token);
router.replace(getRedirectUrl());
router.refresh();

View File

@ -32,6 +32,7 @@ export async function appleLoginCallback(
return request<API.Response & { data?: any }>('/v1/auth/oauth/callback/apple', {
method: 'POST',
data: formData,
requestType: 'form',
...(options || {}),
});
}
@ -78,3 +79,18 @@ export async function oAuthLogin(body: API.OAthLoginRequest, options?: { [key: s
...(options || {}),
});
}
/** OAuth login get token POST /v1/auth/oauth/login/token */
export async function oAuthLoginGetToken(
body: API.OAuthLoginGetTokenRequest,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.LoginResponse }>('/v1/auth/oauth/login/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@ -231,6 +231,12 @@ declare namespace API {
redirect: string;
};
type OAuthLoginGetTokenRequest = {
/** google, facebook, apple, telegram, github etc. */
method: string;
code: string;
};
type OAuthLoginResponse = {
redirect: string;
};