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,
ForgetPasswordInputDto,
DeleteUser,
Token,
TokenRefreshPayload,
AccessToken,
User,
} from './user.interface'
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) {
return axios.post<Token>('/api/users/token', data)
return axios.post<AccessToken>('/api/users/token', data)
}
export async function logout() {
@ -23,17 +22,17 @@ export async function logout() {
}
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) {
return axios.delete('/api/users/me', { data })
}
let refreshing: Promise<AxiosResponse<Token>> | null
export async function refreshToken(data: TokenRefreshPayload) {
let refreshing: Promise<AxiosResponse<AccessToken>> | null
export async function refreshToken() {
if (!refreshing) {
refreshing = axios.put<Token>('/api/users/me/token', data).finally(() => {
refreshing = axios.put<AccessToken>('/api/users/me/token').finally(() => {
refreshing = null
})
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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