use cookie to send refreshToken

This commit is contained in:
秦秋旭 2023-02-28 00:11:58 +08:00
parent f7d80956da
commit 3a3f427daa
8 changed files with 15 additions and 31 deletions

View File

@ -5,17 +5,16 @@ import {
RegisterInputDto, RegisterInputDto,
ForgetPasswordInputDto, ForgetPasswordInputDto,
DeleteUser, DeleteUser,
Token, AccessToken,
TokenRefreshPayload,
User, User,
} from './user.interface' } from './user.interface'
export async function register(data: RegisterInputDto) { export async function register(data: RegisterInputDto) {
return axios.post<Token>('/api/users', data) return axios.post<AccessToken>('/api/users', data)
} }
export async function login(data: LoginInputDto) { export async function login(data: LoginInputDto) {
return axios.post<Token>('/api/users/token', data) return axios.post<AccessToken>('/api/users/token', data)
} }
export async function logout() { export async function logout() {
@ -23,17 +22,17 @@ export async function logout() {
} }
export async function forgetPassword(data: ForgetPasswordInputDto) { export async function forgetPassword(data: ForgetPasswordInputDto) {
return axios.patch<Token>('/api/users/password', data) return axios.patch<AccessToken>('/api/users/password', data)
} }
export async function deleteUser(data: DeleteUser) { export async function deleteUser(data: DeleteUser) {
return axios.delete('/api/users/me', { data }) return axios.delete('/api/users/me', { data })
} }
let refreshing: Promise<AxiosResponse<Token>> | null let refreshing: Promise<AxiosResponse<AccessToken>> | null
export async function refreshToken(data: TokenRefreshPayload) { export async function refreshToken() {
if (!refreshing) { if (!refreshing) {
refreshing = axios.put<Token>('/api/users/me/token', data).finally(() => { refreshing = axios.put<AccessToken>('/api/users/me/token').finally(() => {
refreshing = null refreshing = null
}) })
} }

View File

@ -23,14 +23,7 @@ export interface DeleteUser extends EmailVerifyDto {
password: string password: string
} }
export interface Token { export type AccessToken = string
accessToken: string
refreshToken: string
}
export interface TokenRefreshPayload {
refreshToken: string
}
/** 用户 */ /** 用户 */
export interface User { export interface User {

View File

@ -38,7 +38,6 @@ export function DeleteUser() {
onSubmit: async (values) => { onSubmit: async (values) => {
await api.user.deleteUser(values) await api.user.deleteUser(values)
localStorage.removeItem('accessToken') localStorage.removeItem('accessToken')
localStorage.removeItem('refreshToken')
toast.success('用户删除成功') toast.success('用户删除成功')
router.push('/login') router.push('/login')
}, },

View File

@ -34,8 +34,7 @@ export default function ForgetPassword() {
}), }),
onSubmit: async (values) => { onSubmit: async (values) => {
const res = await api.user.forgetPassword(values) const res = await api.user.forgetPassword(values)
localStorage.setItem('accessToken', res.data.accessToken) localStorage.setItem('accessToken', res.data)
localStorage.setItem('refreshToken', res.data.refreshToken)
toast.success('密码重置成功!', { toast.success('密码重置成功!', {
onClose: () => router.push('/login'), onClose: () => router.push('/login'),
}) })

View File

@ -30,7 +30,6 @@ export default function Home() {
async function logout() { async function logout() {
await api.user.logout() await api.user.logout()
localStorage.removeItem('accessToken') localStorage.removeItem('accessToken')
localStorage.removeItem('refreshToken')
router.push('/login') router.push('/login')
} }

View File

@ -26,8 +26,7 @@ export default function Login() {
}), }),
onSubmit: async (values) => { onSubmit: async (values) => {
const res = await api.user.login(values) const res = await api.user.login(values)
localStorage.setItem('accessToken', res.data.accessToken) localStorage.setItem('accessToken', res.data)
localStorage.setItem('refreshToken', res.data.refreshToken)
router.push('/') router.push('/')
}, },
}) })

View File

@ -32,8 +32,7 @@ export default function Register() {
}), }),
onSubmit: async (values) => { onSubmit: async (values) => {
const res = await api.user.register(values) const res = await api.user.register(values)
localStorage.setItem('accessToken', res.data.accessToken) localStorage.setItem('accessToken', res.data)
localStorage.setItem('refreshToken', res.data.refreshToken)
router.push('/') router.push('/')
}, },
}) })

View File

@ -38,14 +38,11 @@ axios.interceptors.response.use(
} }
switch (error.response?.status) { switch (error.response?.status) {
case status.UNAUTHORIZED: { case status.UNAUTHORIZED: {
const refreshToken = localStorage.getItem('refreshToken') if (error.config?.url === '/api/users/token') {
if (!refreshToken) { throw throwError(error)
Router.push('/login')
return Promise.reject(error)
} }
const res = await api.user.refreshToken({ refreshToken }) const res = await api.user.refreshToken()
localStorage.setItem('accessToken', res.data.accessToken) localStorage.setItem('accessToken', res.data)
localStorage.setItem('refreshToken', res.data.refreshToken)
return error.config && axios.request(error.config) return error.config && axios.request(error.config)
} }
default: { default: {