Token认证拦截器
信息
策略类型:拦截器
版本要求:v1.3.0+
在使用扩展 hooks 前,确保你已熟悉了 alova 的基本使用。
Token 认证拦截器,对基于 token 的登录、登出、token 附带、token 刷新进行统一管理,并支持无感刷新 token。
特性
- 统一维护 Token 身份认证的所有代码,包括登录、登出、token 附带、token 刷新等;
- 支持在客户端和服务端验证 token 过期,并无感刷新 token;
- 依赖 token 的请求自动等待 token 刷新完成再请求;
- 使用元数据设置请求身份;
- 自动放行不依赖 token 的访客请求;
安装
- vue
- react
- svelte
# npm
npm install @alova/scene-vue --save
# yarn
yarn add @alova/scene-vue
# npm
npm install @alova/scene-react --save
# yarn
yarn add @alova/scene-react
# npm
npm install @alova/scene-svelte --save
# yarn
yarn add @alova/scene-svelte
信息
以下所有拦截器都是可选的,只需要选择需要使用的即可。
绑定 Token 认证拦截器
Token 身份认证是通过全局的拦截器完成的,分别提供了createClientTokenAuthentication
和createServerTokenAuthentication
用于基于客户端和服务端的身份认证。
- 基于客户端的身份认证:表示从客户端判断 token 是否过期,例如在登录时获取到的 token 过期时间;
- 基于服务端的身份认证:表示从服务端返回的状态判断 token 是否过期,例如
status
为 401 时表示过期;
绑定基于客户端的身份认证的拦截器
import { createClientTokenAuthentication } from '@alova/scene-*';
import { createAlova } from 'alova';
const { onAuthRequired, onResponseRefreshToken } = createClientTokenAuthentication({
// ...
});
const alovaInstance = createAlova({
// ...
beforeRequest: onAuthRequired(method => {
// ...原请求前拦截器
}),
responded: onResponseRefreshToken((response, method) => {
//...原响应成功拦截器
return response.json();
})
});
在onResponseRefreshToken
中也可以绑定响应错误和完成的拦截器,也和原来的用法相同。
createAlova({
// ...
responded: onResponseRefreshToken({
onSuccess: (response, method) => {
//...原响应成功拦截器
},
onError: (error, method) => {
//...原响应错误拦截器
},
onComplete: method => {
//...原响应完成拦截器
}
})
});
如果不需要设置拦截器,也可以不传入拦截器函数。
createAlova({
//...
beforeRequest: onAuthRequired(),
responded: onResponseRefreshToken()
});
绑定基于服务端的身份认证拦截器
与基于客户端的用法相同
import { createServerTokenAuthentication } from '@alova/scene-*';
import { createAlova } from 'alova';
const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication({
// ...
});
const alovaInstance = createAlova({
// ...
beforeRequest: onAuthRequired(method => {
// ...原请求前拦截器
}),
responded: onResponseRefreshToken((response, method) => {
//...原响应成功拦截器
return response.json();
})
});
注意
当你使用GlobalFetch
适配器时,你可能会遇到TypeError: Failed to execute 'json' on 'Response': body stream already read
这个问题,这是因为Response
的body stream
只能访问一次,你可以response.clone().json()
来解决它。