Skip to content

认证体系

模块a-auth提供了通用的认证体系,使用Auth Provider支持各种认证方式

特性

  • Auth Provider:使用Auth Provider支持各种认证方式,如:用户名/密码认证、OAuth 认证(Github),等等
  • Clients:同一个 Provider 可以提供多个凭证
  • 关联认证:可以为同一个用户关联多个认证方式
  • 迁移认证:可以将一个用户的认证方式迁移到另一个用户

bean.auth

模块a-auth提供了全局 Bean bean.auth,可以通过统一的方式使用所有 Provider 提供的认证能力

  • 举例:用户名/密码认证
typescript
class ControllerStudent {
  @Web.get('login')
  @Passport.public()
  async login() {
    const jwt = await this.bean.auth.authenticate('a-authsimple:simple', {
      clientOptions: { username: 'admin', password:'123456' },
    });
    return jwt;
  }
}
  • 简化方式:
typescript
class ControllerStudent {
  @Web.get('login')
  @Passport.public()
  async login() {
    const jwt = await this.bean.authSimple.authenticate(
      { username: 'admin', password:'123456' }
    );
    return jwt;
  }
}
  • 举例:Github认证

Github认证是独立的模块,需要安装到项目中:

bash
$ pnpm add vona-module-a-authgithub -w
typescript
class ControllerStudent {
  @Web.get('login')
  @Passport.public()
  async login() {
    await this.bean.auth.authenticate(
      'a-authgithub:github',
      { state: { redirect: '/' } },
    );
  }
}

设置OAuth认证凭据

仍以Github为例,在 App Config 中设置认证凭据

src/backend/config/config/config.ts

typescript
// onions
config.onions = {
  authProvider: {
    'a-authgithub:github': {
      clients: {
        default: {
          clientID: 'xxxxxx',
          clientSecret: 'xxxxxxx',
        },
      },
    },
  },
};
  • clients.default: 一个 Provider 可以设置多个 Clients,默认是default

如何添加更多Client凭据

  • 首先采用接口合并机制添加 Client 类型定义

在 VSCode 编辑器中,输入代码片段recordauthclient,自动生成代码骨架:

typescript
declare module 'vona-module-x-x' {
  export interface IAuthProvider_xxx_ClientRecord {
    : never;
  }
}

调整代码:

typescript
declare module 'vona-module-a-authgithub' {
  export interface IAuthProviderGithubClientRecord {
    another: never;
  }
}
  • 然后在 App Config 中设置认证凭据
diff
// onions
config.onions = {
  authProvider: {
    'a-authgithub:github': {
      clients: {
        default: {
          clientID: 'xxxxxx',
          clientSecret: 'xxxxxxx',
        },
+       another: {
+         clientID: 'yyyyyy',
+         clientSecret: 'yyyyyyy',
+       },
      },
    },
  },
};

OAuth认证Callback URL

在使用 OAuth 认证时,需要在 OAuth 网站提供系统的 Callback URL

VonaJS 提供了统一的 Callback URL 值,并且在开发阶段直接输出在控制台,方便我们直接使用

bean.auth.authenticate

方法定义

typescript
async authenticate<T extends keyof IAuthProviderRecord>(
  authProviderName: T,
  options?: IAuthenticateOptions<IAuthProviderRecord[T]>,
): Promise<IJwtToken | undefined>{}

返回值

  • 对于不需要 redirect 的认证方式,当认证成功后返回 jwt token
  • 对于需要 redirect 的认证方式,当认证成功后直接转向 redirect

参数

名称说明
authProviderNameProvider名称
options.clientNameClient名称,缺省为default
options.clientOptionsClient选项,不同的Provider有各自不同的Options定义
options.state本次认证的状态值
  • options.clientOptions

对于 OAuth 认证,有以下基本字段:

名称说明
clientID凭证ID
clientSecret凭证密钥
scope授权范围
confirmed用户是否为确认状态

TIP

confirmed: 一般而言,对于新用户,如果 OAuth 认证返回了有效的 email,可以认为confirmed=true,从而不必执行后续的用户激活操作。根据业务的需求,可以灵活定制confirmed的判断规则

  • options.state
名称类型说明
intention'register' | 'login' | 'associate' | 'migrate'本次认证的意图,默认为login
redirectstring | undefined本次认证成功后需要转向的 URL

TIP

redirect: OAuth 认证成功后会返回code值,该值会附加到 URL Query 中,形如:/?x-vona-oauth-code=xxxxxx

前端取得x-vona-oauth-code值,再调用后端 api 换取jwt token

Passport API

模块home-user提供了一组开箱即用的 Passport API,也可以在此基础之上扩展自定义的业务逻辑

src/suite/a-home/modules/home-user/src/controller/passport.ts

名称说明
current获取当前Passport
logout退出登录
register注册新用户
login登录
loginOauthOAuth认证
associate关联认证
migrate迁移认证

基于 MIT 许可发布