Skip to content

Bearer Token策略

使用一段普通的token令牌作为身份依据

安装

bash
pnpm add @aomex/auth-bearer-strategy

使用

typescript
import { Auth } from '@aomex/auth';
import { BearerStrategy } from '@aomex/auth-bearer-strategy';

export const auth = new Auth({
  strategies: {
    bearer: new BearerStrategy({}),
  },
});

参数

onLoaded

签名:(token: string, ctx: WebContext) => Promise<T | false>

获取令牌后,需要返回这个token相应的身份数据,比如:{ id: 1, name: 'abc' }。如果token是无效的,请直接返回false

返回的身份数据在路由中可直接使用

typescript
export const auth = new Auth({
  strategies: {
    bearer: new BearerStrategy({
      async onLoaded(token, ctx) {
        // 返回值的类型会被反向推导到中间件
        return { id: 1, name: 'abc', scopes: [] };
      },
    }),
  },
});

router.get('/api', {
  mount: [
    auth.authenticate('bearer'),
  ],
  action: (ctx) => {
    console.log(ctx.auth.bearer.data); // { id: 1, name: 'abc' }
  },
});

onAuthorize

签名:(...scopes) => Promise<boolean>

身份认证后进行权限认证。中间件可以和身份认证一起使用,也可以单独使用,有利于灵活控制不同路由的权限。

typescript
type Scopes = 'create' | 'update' | 'retrieve' | 'delete';

const auth = new Auth({
  strategies: {
    bearer: new BearerStrategy({
      async onLoaded(token, ctx) {
        return { id: 1, name: 'abc', scopes: [] };
      },
      onAuthorize(...scopes: Scopes[]) {
        // 获得 onLoaded 的返回值
        const user = this.getIdentity();
        // 取权限交集
        const accepted = intersection(scopes, user.scopes);
        return accepted.length > 0;
      },
    }),
  },
});

router.get('/api', {
  mount: [
    // 一体式
    auth.authenticate('bearer').authorize('create', 'update')
  ],
  action: (ctx) => {},
});

router.get('/api', {
  mount: [
    auth.authenticate('bearer'),
    // 独立式
    auth.authorize('bearer', 'create', 'update')
  ],
  action: (ctx) => {},
});

tokenLoaders

签名:TokenLoaderItem[]
默认值:[{ type: 'header', key: 'authorization' }]

允许从不同的位置获取令牌,并按照数据顺序依次寻找,直到找到令牌。

type包含:header, body, query, cookie
header的key建议使用authorization,其它源的key建议使用access_token

方法

signature

签名:(algorithm: string, uniqueKey?: string | number) => string

strategy包含一个生成token的方法

typescript
const token = auth.strategy('bearer').signature('md5');