npm package: @flyriselink/pai-auth-api
Description: Pai auth api tools.
Author: flyriselink
Latest version: 2.0.1

# pai-auth-api 工具使用指南

> 此工具兼容了独立运行、工作台微应用运行两种运行方式。

## 安装依赖

[pai-auth-api](https://www.npmjs.com/package/@flyriselink/pai-auth-api)

```bash
# 建议先锁定npm安装版本
# npm config set save-prefix=''
npm install @flyriselink/pai-auth-api
```

## 工具初始化

```js
import AuthApi from '@flyriselink/pai-auth-api'

const Auth = new AuthApi({
  // 源地址（协议+域名+端口），主要用于跳转登录
  origin: process.env.Origin, 
  // 接口前置地址，主要用于满足生产环境的接口请求的代理
  baseURL: process.env.BaseURL, 
})

export default Auth
```

## 主要API

```ts
// 注意：均以异步方法执行

// 登录
login(opts?: ConfirmOptions): Promise<boolean>
// 登出（比login多一步：清缓存、token失效）
logout(opts?: LogoutOptions): Promise<boolean>
// 获取token
getToken(opts?: GetTokenOptions): Promise<string>
// 获取用户信息
getUserInfo(opts?: GetUserInfoOptions): Promise<UserInfo | null | void>
// 处理请求
requestHandler(req: AxiosRequestConfig | AuthRequestConfig): Promise<void>
// 处理响应
responseHandler(res: AxiosResponse | AuthResponse): Promise<ResponseStatusTypes>
```

- 登录/登出

> 一般情况下，使用登出（logout）接口即可。

```js
let options = {
    // 参数配置
}
await Auth.logout(options)
```

配置说明

```ts
/**
 * 操作完成后，是否跳转登录
 * 默认为false，即操作完成后马上跳转至授权中心
 */
stay?: boolean
/**
 * 指定回调地址
 * 默认为当前操作url
 */
redirectUrl?:string 
/**
 * 是否启用确认框，操作之前需要确认操作
 * 默认为false
 */
confirm?: boolean
/**
 * 确认框回调
 * 当confirm设为true，此配置才会生效
 * 为一个返回Promise<boolean>的异步方法
 */
confirmCallback(): Promise<boolean>
```

示例：确认框回调

```js
await this.$auth.logout({
  confirm: true,
  confirmCallback: () => { 
    // $confirm为ElementUI的确认框
    return this.$confirm('确定要登出工作台吗？', '提示', {
      type: 'warning',
      confirmButtonText: '确定',
      cancelButtonText: '取消',
    })
  },
})
```

- 获取token

```js
let options = {
    // 参数配置
}
await Auth.getToken(options)
```

配置说明

```ts
/**
 * 获取失败（包括token为空），是否跳转登录
 * 默认为false
 */
stay?: boolean
```

- 获取用户信息

```js
let options = {
    // 参数配置
}
await Auth.getUserInfo(options)
```

配置说明

```ts
/**
 * 获取失败（包括token为空），是否跳转登录
 * 默认为false
 */
stay?: boolean
```

- 处理请求

> 目前该API会为Axios请求的headers中注入Authorization信息

示例：在拦截器中使用（request）

```js
// 请求成功
(config) => {
  // 是否启用认证校验
  if (process.env.isAuth) {
    try {
      // 填充config.headers.Authorization的值（暂时只有这个处理逻辑）
      await Auth.requestHandler(config)
      //
      // ...自行实现其它判断逻辑
    } catch (e) {
      console.error(e)
      return config
    }
  }
  return config
}
```

- 处理响应

示例：在拦截器中使用（response）

```js
import { ResponseStatusTypes } from '@flyriselink/pai-auth-api'

// 请求响应成功
(res) => {
  // 是否启用认证校验
  if (process.env.isAuth) {
    try {
      // 排除了401（可能会处理更多<1000的错误码）的情况
      const result = await Auth.responseHandler(res, {
        // 开启跳转登录前确认
        confirm: true,
        confirmCallback: () => {
          // 跳转登录前确认，返回结果决定是否跳转（Promise<Boolean>）
          return MessageBox.confirm(I18n.t('common.reloginTips'), I18n.t('common.systemTips'), {
            type: 'warning',
            confirmButtonText: I18n.t('common.relogin'),
            showCancelButton: false,
            showClose: false,
          })
        },
      })
      if (result !== ResponseStatusTypes.Pass) {
        // 认证失败
        return Promise.reject(Error)
      }
      // 判断返回结果是否有效
      if (res?.data?.code?.toString() !== '200') {
        Notification.error({
          title: I18n.t('common.error'),
          message: res.data.msg || res.data.message || res.data.code || I18n.t('common.error'),
          duration: 2000,
        })
        return Promise.reject(Error)
      } else {
        //
        // ...自行实现其它判断逻辑
        return res?.data
      }
      // ...自行实现其它判断逻辑
    } catch (e) {
      console.error(e)
      return res
    }
  }
  return res
}
```