跳转至

JavaScript / TypeScript Hooks

JavaScript / TypeScript Hooks 编写为一个 ES2015 模块,该模块由 Deno 执行。

该模块必须有一个默认导出(default export),导出一个接受 1 个参数的函数。该参数即为事件。函数可以是同步的,也可以是异步的。

如果该 Hook 注册用于阻塞事件,函数必须按照规范返回一个值。

Hook 无法访问文件或环境变量,只能访问外部网络。

Hook 的 stdout 和 stderr 都会被忽略。您的 Hook 不得对模块的参数和 stdin 做任何假设。

在 Authany 项目中配置 JavaScript / TypeScript Hooks

  • 在管理台中,进入高级 > Hooks。
  • 根据您想监听的事件类型,在阻塞事件或非阻塞事件中添加您的 JavaScript / TypeScript Hook 处理程序。
  • 点击保存。

示例

下面是一个用于阻塞事件的 Hook 示例。

import { HookEvent, HookResponse } from "https://deno.land/x/authgear_deno_hook@v1.6.1/mod.ts";
export default async function(e: HookEvent): Promise<HookResponse> {
  // This hook simply allows the operation, which is identical to no-op.
  return { is_allowed: true };
}

一个修改 JWT 令牌的示例

import {HookResponse, EventOIDCJWTPreCreate } from "https://deno.land/x/authgear_deno_hook@v1.0.0/mod.ts";

export default async function(event: EventOIDCJWTPreCreate): Promise<HookResponse> {
  return { 
    is_allowed: true,
    mutations: {
      jwt:{
        payload:{
          ...event.payload.jwt.payload, //the original payload in the jwt
          "https://myapp.com": {
            "custom_field": "custom_value"
          }
        }
      }
    }
  };
}

下面是一个用于非阻塞事件的 Hook 示例。

import { HookEvent } from "https://deno.land/x/authgear_deno_hook@v0.3.0/mod.ts";
export default async function(e: HookEvent): Promise<void> {
  // This hook does nothing, which is identical to no-op.
}

TypeScript 定义

https://deno.land/x/authgear_deno_hook 是一份 TypeScript 定义,可帮助您编写 Hook。完整定义见 https://deno.land/x/authgear_deno_hook/mod.ts

如果您使用 Visual Studio Code,可以配置编辑器以充分利用该定义。

此外,您也可以编辑 Hook 后使用 Deno CLI 进行类型检查。

$ deno check YOUR_HOOK.ts