@polyv/request-plugin-authorize-token 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -0
- package/authorize-token.d.ts +19 -0
- package/authorize-token.js +87 -0
- package/config.d.ts +9 -0
- package/config.js +9 -0
- package/index.d.ts +3 -0
- package/index.js +3 -0
- package/package.json +9 -0
- package/request-options.d.ts +26 -0
- package/request-options.js +1 -0
- package/types.d.ts +59 -0
- package/types.js +14 -0
package/README.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# AuthorizeTokenRequestPlugin
|
|
2
|
+
|
|
3
|
+
用途:请求令牌插件,使用后会在所有请求中插入令牌信息。
|
|
4
|
+
|
|
5
|
+
## 实例化参数
|
|
6
|
+
|
|
7
|
+
| 参数名 | 用途 | 类型 | 默认值 |
|
|
8
|
+
| - | - | - | - |
|
|
9
|
+
| `useToken` | 默认使用 token 插件 | `boolean` | `true` |
|
|
10
|
+
| `responseTokenField` | 在响应中返回的令牌字段 | `string` | - |
|
|
11
|
+
| `getTokenInfo` | 获取授权令牌信息 | `function` | - |
|
|
12
|
+
| `responseTokenCallback` | 响应中获取令牌后的回调 | `function` | - |
|
|
13
|
+
|
|
14
|
+
## 请求选项
|
|
15
|
+
|
|
16
|
+
| 参数名 | 用途 | 类型 | 默认值 |
|
|
17
|
+
| - | - | - | - |
|
|
18
|
+
| `useToken` | 是否使用 token 授权 | `boolean` | `true` |
|
|
19
|
+
| `tokenInfo` | 令牌信息 | `TokenInfo` | - |
|
|
20
|
+
|
|
21
|
+
## 令牌信息类型
|
|
22
|
+
|
|
23
|
+
`TokenInfo` 类型如下:
|
|
24
|
+
|
|
25
|
+
| 参数名 | 用途 | 类型 | 默认值 |
|
|
26
|
+
| - | - | - | - |
|
|
27
|
+
| `token` | 授权令牌 | `string` | - |
|
|
28
|
+
| `tokenMode` | 令牌方式,仅在 request 中生效 | `TokenMode` | `TokenMode.Params` |
|
|
29
|
+
| `tokenField` | 在请求中插入的令牌字段 | `string` | `'token'` |
|
|
30
|
+
| `includeParams` | 插入的 params | `object` | - |
|
|
31
|
+
|
|
32
|
+
## 使用方式
|
|
33
|
+
|
|
34
|
+
```js
|
|
35
|
+
import { PolyvRequest } from '@polyv/request-core';
|
|
36
|
+
import { AuthorizeTokenRequestPlugin, TokenMode } from '@polyv/request-plugin-authorize-token';
|
|
37
|
+
|
|
38
|
+
// 方式一:直接传入令牌信息
|
|
39
|
+
const requester = new PolyvRequest({
|
|
40
|
+
requestPlugins: [
|
|
41
|
+
new AuthorizeTokenRequestPlugin({
|
|
42
|
+
token: 'xxxxx',
|
|
43
|
+
tokenMode: TokenMode.Header,
|
|
44
|
+
tokenField: 'xAuthToken',
|
|
45
|
+
}),
|
|
46
|
+
]
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// 方式二(推荐):支持传入 getTokenInfo 方法获取,返回 TokenInfo 类型,优先级高于直接传入
|
|
50
|
+
const requester = new PolyvRequest({
|
|
51
|
+
requestPlugins: [
|
|
52
|
+
new AuthorizeTokenRequestPlugin({
|
|
53
|
+
getTokenInfo: async (options) => {
|
|
54
|
+
return {
|
|
55
|
+
token: 'xxxxx',
|
|
56
|
+
tokenMode: TokenMode.Header,
|
|
57
|
+
tokenField: 'xAuthToken',
|
|
58
|
+
// 额外插入到 params
|
|
59
|
+
includeParams: {
|
|
60
|
+
channelId: 'xxx',
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
}),
|
|
65
|
+
]
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// 方式三:调用时传入 tokenInfo
|
|
69
|
+
requester.get('/xxx', {}, {
|
|
70
|
+
tokenInfo: {
|
|
71
|
+
token: 'xxxxx',
|
|
72
|
+
tokenMode: TokenMode.Params,
|
|
73
|
+
tokenField: 'xAuthToken',
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// 如果你想在某个请求中,不处理令牌操作时
|
|
78
|
+
requester.get('/xxxx', {}, {
|
|
79
|
+
useToken: false,
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### TokenMode 区别
|
|
84
|
+
|
|
85
|
+
- `TokenMode.Params`:通过地址参数入参令牌
|
|
86
|
+
- `TokenMode.Header`:通过请求头插入令牌
|
|
87
|
+
|
|
88
|
+
### 自动获取响应头中的授权令牌
|
|
89
|
+
|
|
90
|
+
实例化插件时入参 `responseTokenField`,插件内部会自动获取接口响应中的令牌,并在请求时如果不传入 tokenInfo,则使用响应中的令牌,示例如下:
|
|
91
|
+
|
|
92
|
+
```js
|
|
93
|
+
const requester = new PolyvRequest({
|
|
94
|
+
requestPlugins: [
|
|
95
|
+
new AuthorizeTokenRequestPlugin({
|
|
96
|
+
responseTokenField: 'x-auth-token',
|
|
97
|
+
responseTokenCallback: (data) => {
|
|
98
|
+
console.log('从接口响应中获取到的令牌', data.token);
|
|
99
|
+
},
|
|
100
|
+
}),
|
|
101
|
+
]
|
|
102
|
+
});
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
此时在每次接口请求后,会从响应头中获取 `x-auth-token` 作为令牌并记录,后续接口中,如果没有入参令牌则以该令牌传入。
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RequestOptions, RequestPlugin, RequestResult } from '@polyv/request-core';
|
|
2
|
+
import { AuthorizeTokenRequestPluginConfig, TokenInfo } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 授权 token 请求插件
|
|
5
|
+
*/
|
|
6
|
+
export declare class AuthorizeTokenRequestPlugin implements RequestPlugin {
|
|
7
|
+
private __useToken;
|
|
8
|
+
private __config;
|
|
9
|
+
private __recordToken?;
|
|
10
|
+
constructor(config?: AuthorizeTokenRequestPluginConfig);
|
|
11
|
+
usePlugin(options: RequestOptions): boolean;
|
|
12
|
+
interceptAuthorizeRequest(options: RequestOptions): Promise<RequestOptions>;
|
|
13
|
+
interceptResponse(result: RequestResult, options: RequestOptions): Promise<RequestResult | void>;
|
|
14
|
+
/**
|
|
15
|
+
* 获取请求令牌信息
|
|
16
|
+
* @param options 插件请求选项
|
|
17
|
+
*/
|
|
18
|
+
protected __getTokenInfo(options: RequestOptions): Promise<TokenInfo | undefined>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { DEFAULT_TOKEN_FIELD, DEFAULT_TOKEN_MODE } from './config';
|
|
2
|
+
import { TokenMode } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 授权 token 请求插件
|
|
5
|
+
*/
|
|
6
|
+
export class AuthorizeTokenRequestPlugin {
|
|
7
|
+
__useToken;
|
|
8
|
+
__config;
|
|
9
|
+
__recordToken;
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
const { useToken = true } = config;
|
|
12
|
+
this.__config = config;
|
|
13
|
+
this.__useToken = useToken;
|
|
14
|
+
}
|
|
15
|
+
usePlugin(options) {
|
|
16
|
+
const { useToken = this.__useToken } = options;
|
|
17
|
+
return useToken;
|
|
18
|
+
}
|
|
19
|
+
async interceptAuthorizeRequest(options) {
|
|
20
|
+
// 获取令牌信息
|
|
21
|
+
const tokenInfo = await this.__getTokenInfo(options);
|
|
22
|
+
if (!tokenInfo) {
|
|
23
|
+
return options;
|
|
24
|
+
}
|
|
25
|
+
const token = tokenInfo.token || this.__recordToken;
|
|
26
|
+
if (!token) {
|
|
27
|
+
return options;
|
|
28
|
+
}
|
|
29
|
+
const { tokenField = DEFAULT_TOKEN_FIELD, tokenMode = DEFAULT_TOKEN_MODE, includeParams = {}, } = tokenInfo;
|
|
30
|
+
let params = (options.params || {});
|
|
31
|
+
const headers = (options.headers || {});
|
|
32
|
+
// 插入额外的 params
|
|
33
|
+
if (includeParams) {
|
|
34
|
+
params = Object.assign({}, params, includeParams);
|
|
35
|
+
}
|
|
36
|
+
// token 在 params 上
|
|
37
|
+
if (tokenMode === TokenMode.Params) {
|
|
38
|
+
params[tokenField] = token;
|
|
39
|
+
}
|
|
40
|
+
// token 在 header 上
|
|
41
|
+
if (tokenMode === TokenMode.Header) {
|
|
42
|
+
headers[tokenField] = token;
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
...options,
|
|
46
|
+
params,
|
|
47
|
+
headers,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async interceptResponse(result, options) {
|
|
51
|
+
if (!result.headers) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const responseTokenField = options.responseTokenField || this.__config.responseTokenField;
|
|
55
|
+
if (!responseTokenField) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const headers = result.headers;
|
|
59
|
+
const responseToken = headers[responseTokenField];
|
|
60
|
+
if (responseToken) {
|
|
61
|
+
this.__recordToken = responseToken;
|
|
62
|
+
// 触发回调
|
|
63
|
+
if (this.__config.responseTokenCallback) {
|
|
64
|
+
this.__config.responseTokenCallback({ token: responseToken });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 获取请求令牌信息
|
|
70
|
+
* @param options 插件请求选项
|
|
71
|
+
*/
|
|
72
|
+
async __getTokenInfo(options) {
|
|
73
|
+
let info = {
|
|
74
|
+
...this.__config,
|
|
75
|
+
};
|
|
76
|
+
if (typeof this.__config.getTokenInfo === 'function') {
|
|
77
|
+
// 第二优先:实例化参数的 getToken
|
|
78
|
+
const res = await this.__config.getTokenInfo(options) || {};
|
|
79
|
+
info = { ...info, ...res };
|
|
80
|
+
}
|
|
81
|
+
if (options.tokenInfo) {
|
|
82
|
+
// 第一优先:请求选项
|
|
83
|
+
info = { ...info, ...options.tokenInfo };
|
|
84
|
+
}
|
|
85
|
+
return info;
|
|
86
|
+
}
|
|
87
|
+
}
|
package/config.d.ts
ADDED
package/config.js
ADDED
package/index.d.ts
ADDED
package/index.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { TokenInfo } from './types';
|
|
2
|
+
export interface AuthorizeTokenRequestOptions {
|
|
3
|
+
/**
|
|
4
|
+
* 是否使用 token 授权
|
|
5
|
+
* @default true
|
|
6
|
+
* @plugin `AuthorizeTokenRequestPlugin`
|
|
7
|
+
*/
|
|
8
|
+
useToken?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 令牌信息
|
|
11
|
+
* @plugin `AuthorizeTokenRequestPlugin`
|
|
12
|
+
*/
|
|
13
|
+
tokenInfo?: TokenInfo;
|
|
14
|
+
/**
|
|
15
|
+
* 在响应中返回的令牌字段
|
|
16
|
+
*/
|
|
17
|
+
responseTokenField?: string;
|
|
18
|
+
}
|
|
19
|
+
declare module '@polyv/request-core' {
|
|
20
|
+
interface RequestCustomOptions extends AuthorizeTokenRequestOptions {
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
declare module 'axios' {
|
|
24
|
+
interface AxiosRequestConfig extends AuthorizeTokenRequestOptions {
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/types.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { RequestOptions } from "@polyv/request-core";
|
|
2
|
+
export interface AuthorizeTokenRequestPluginConfig extends TokenInfo {
|
|
3
|
+
/**
|
|
4
|
+
* 默认使用 token 插件
|
|
5
|
+
* @default true
|
|
6
|
+
*/
|
|
7
|
+
useToken?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* 在响应中返回的令牌字段
|
|
10
|
+
*/
|
|
11
|
+
responseTokenField?: string;
|
|
12
|
+
/**
|
|
13
|
+
* 获取授权令牌信息
|
|
14
|
+
*/
|
|
15
|
+
getTokenInfo?: GetTokenFn;
|
|
16
|
+
/**
|
|
17
|
+
* 响应中获取令牌后的回调
|
|
18
|
+
*/
|
|
19
|
+
responseTokenCallback?: (data: {
|
|
20
|
+
token: string;
|
|
21
|
+
}) => unknown;
|
|
22
|
+
}
|
|
23
|
+
export type GetTokenFn = (options: RequestOptions) => Promise<TokenInfo | void> | TokenInfo | void;
|
|
24
|
+
/**
|
|
25
|
+
* 授权令牌模式
|
|
26
|
+
*/
|
|
27
|
+
export declare enum TokenMode {
|
|
28
|
+
/**
|
|
29
|
+
* 通过请求头插入
|
|
30
|
+
*/
|
|
31
|
+
Header = "header",
|
|
32
|
+
/**
|
|
33
|
+
* 通过地址参数插入
|
|
34
|
+
*/
|
|
35
|
+
Params = "params"
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 令牌信息
|
|
39
|
+
*/
|
|
40
|
+
export interface TokenInfo {
|
|
41
|
+
/**
|
|
42
|
+
* 授权令牌
|
|
43
|
+
*/
|
|
44
|
+
token?: string;
|
|
45
|
+
/**
|
|
46
|
+
* 令牌模式,仅在 request 中生效
|
|
47
|
+
* @default TokenMode.Params
|
|
48
|
+
*/
|
|
49
|
+
tokenMode?: TokenMode;
|
|
50
|
+
/**
|
|
51
|
+
* 在请求中插入的令牌字段
|
|
52
|
+
* @default 'token'
|
|
53
|
+
*/
|
|
54
|
+
tokenField?: string;
|
|
55
|
+
/**
|
|
56
|
+
* 插入的 params
|
|
57
|
+
*/
|
|
58
|
+
includeParams?: object;
|
|
59
|
+
}
|