在 React Native 中实现 jwt 客户端
implement jwt client in react native
我想在RN中实现jwt客户端。获取新令牌可以正常工作,但是当令牌过期并且我想刷新令牌时它不会 work.This 是我的获取功能代码:
let result = await instance
.get(url)
.then(({data}) => {
if (data.error) {
return {data: data.message, error: true, redirect: false};
}
return {data: data.data, error: false, redirect: false};
})
.catch(err => {
if (err.response.status === 401) {
async () => {
let res = await this.RefreshToken().result;
if (res) {
return Get(url, withToken);
} else {
return {data: '', error: true, redirect: true};
}
};
} else {
return {data: 'Process Error', error: true, redirect: false};
}
});
在上面的代码中,catch 中的 "async ()" 部分不起作用。
这是我的 RefreshToken 函数:
export async function RefreshToken() {
try {
const ref_token = await SInfo.getItem('ref_token');
let result = await instance
.post(
'/refresh_token/',
qs.stringify({
refresh: ref_token,
}),
)
.then(({data}) => {
if (!data.error) {
SInfo.setItem('token', data.token.access, {});
SInfo.setItem('ref_token', data.token.refresh, {});
return {result: true, token: data.token.access};
} else {
return {result: false, token: ''};
}
})
.catch(error => {
return { result: false, token: '' };
});
}
}
不知道是什么问题
解决方案是这样的:
let result = await instance
.get(url)
.then(({data}) => {
if (data.error) {
return {data: data.message, error: true, redirect: false};
}
return {data: data.data, error: false, redirect: false};
})
.catch(err => {
if (err.response.status === 401) {
const refreshToken = async () => {
let res = await this.RefreshToken().result;
if (res) {
return Get(url, withToken);
} else {
return {data: '', error: true, redirect: true};
}
};
refreshToken();
} else {
return {data: 'Process Error', error: true, redirect: false};
}
});
或者我认为更好的解决方案是:
let result = await instance
.get(url)
.then(({data}) => {
if (data.error) {
return {data: data.message, error: true, redirect: false};
}
return {data: data.data, error: false, redirect: false};
})
.catch(async (err) => {
if (err.response.status === 401) {
let res = await this.RefreshToken().result;
if (res) {
return Get(url, withToken);
} else {
return {data: '', error: true, redirect: true};
}
} else {
return {data: 'Process Error', error: true, redirect: false};
}
});
我想在RN中实现jwt客户端。获取新令牌可以正常工作,但是当令牌过期并且我想刷新令牌时它不会 work.This 是我的获取功能代码:
let result = await instance
.get(url)
.then(({data}) => {
if (data.error) {
return {data: data.message, error: true, redirect: false};
}
return {data: data.data, error: false, redirect: false};
})
.catch(err => {
if (err.response.status === 401) {
async () => {
let res = await this.RefreshToken().result;
if (res) {
return Get(url, withToken);
} else {
return {data: '', error: true, redirect: true};
}
};
} else {
return {data: 'Process Error', error: true, redirect: false};
}
});
在上面的代码中,catch 中的 "async ()" 部分不起作用。
这是我的 RefreshToken 函数:
export async function RefreshToken() {
try {
const ref_token = await SInfo.getItem('ref_token');
let result = await instance
.post(
'/refresh_token/',
qs.stringify({
refresh: ref_token,
}),
)
.then(({data}) => {
if (!data.error) {
SInfo.setItem('token', data.token.access, {});
SInfo.setItem('ref_token', data.token.refresh, {});
return {result: true, token: data.token.access};
} else {
return {result: false, token: ''};
}
})
.catch(error => {
return { result: false, token: '' };
});
}
}
不知道是什么问题
解决方案是这样的:
let result = await instance
.get(url)
.then(({data}) => {
if (data.error) {
return {data: data.message, error: true, redirect: false};
}
return {data: data.data, error: false, redirect: false};
})
.catch(err => {
if (err.response.status === 401) {
const refreshToken = async () => {
let res = await this.RefreshToken().result;
if (res) {
return Get(url, withToken);
} else {
return {data: '', error: true, redirect: true};
}
};
refreshToken();
} else {
return {data: 'Process Error', error: true, redirect: false};
}
});
或者我认为更好的解决方案是:
let result = await instance
.get(url)
.then(({data}) => {
if (data.error) {
return {data: data.message, error: true, redirect: false};
}
return {data: data.data, error: false, redirect: false};
})
.catch(async (err) => {
if (err.response.status === 401) {
let res = await this.RefreshToken().result;
if (res) {
return Get(url, withToken);
} else {
return {data: '', error: true, redirect: true};
}
} else {
return {data: 'Process Error', error: true, redirect: false};
}
});