Skip to content

身份认证

请求一些私有资源时,需要识别用户信息后,才能确定该请求应该返回哪部分资源。使用身份认证中间件可以自动识别身份并在上下文携带可用的身份数据。

安装

bash
pnpm add @aomex/auth

使用

身份认证一般是放在需要识别用户的路由组,而不是app入口。

typescript
// src/web.ts
import { WebApp } from '@aomex/core';
import { Auth } from '@aomex/auth';

const auth = new Auth({
  strategies: { s1: new MyStrategy1() },
});

export const router = new Router({
  mount: [auth.authenticate('s1')],
  prefix: '/users',
});

多策略

认证实例作为统一入口,可以包含多种认证策略。使用时,在路由层调用auth.authenticate(...)生成中间件,这样不同的路由就可以混合使用需要的认证策略。

typescript
export const auth = new Auth({
  strategies: {
    aaa: new MyStrategy1(),
    bbb: new MyStrategy2(),
    ccc: new MyStrategy3(),
  },
});

auth.authenticate('aaa'); // 中间件

策略实例

策略里可能会包含一些特殊的方法供用户调用,则可以通过调用auth.strategy(...)这种形式获取实例。

typescript
auth.strategy('aaa').someMethod();

权限认证

身份认证只能过滤已经登录的用户,但是在一些复杂的系统(尤其是后台管理系统),往往包含了权限方面的认证。比如用户A只能访问某个产品数据,用户B不仅能访问还能编辑,用户C则能创建用户。我们往往用scopes来表示用户的权限,比如 scopes=['create', 'retrieve', 'update', 'delete'],不用用户包含的权限数量是不一样的。

typescript
router.get('/api', {
  mount: [
    // 先认证身份
    auth.authenticate('my_strategy'),
    // 再认证权限
    auth.authorize('my_strategy', 'create', 'update'),

    // 身份与权限 合并使用
    auth.authenticate('my_strategy').authorize('create', 'update'),
  ],
  action: async (ctx) => {},
});

WARNING

身份认证失败状态码:401
权限认证失败状态码:403