SuperAPI AI 工具集

shopify-admin-staff-account-audit

安全与审计

查看项目

更新于 10-15 09:36

技能介绍

用途

对店铺内所有员工账号进行审计,暴露安全与访问卫生风险。标记超过 stale_days 天未登录的账号、仍被保留但处于非活跃状态的账号,以及拥有完整权限或等同于店铺所有者权限的账号。只读,不执行任何变更。为后续的访问审查或账号回收流程提供数据基础。

主要能力

  • 查询 staffMembers,分页获取所有员工账号及其状态、最后登录等数据
  • 计算每个成员距上次登录的天数,超过 stale_days(默认 90)即标记为 stale
  • 将 active: false 或 accountType: SUSPENDED 的账号标记为非活跃但仍被保留
  • 将 isShopOwner: true 或 accountType: COLLABORATOR 且权限完整的账号标记为高权限,供人工审查
  • 交叉汇总,为每个账号生成包含 stale、inactive、high_privilege 各标记的记录

使用方式

前置条件:已认证的 Shopify CLI 会话,命令为 shopify store auth --store <domain> --scopes read_users;需要 read_users API 权限;调用者必须是店铺所有者或具备员工管理权限才能查询员工数据。

参数:

  • store(字符串,必填):店铺域名,例如 mystore.myshopify.com
  • stale_days(整数,可选,默认 90):超过该天数无登录活动即标记
  • include_inactive(布尔,可选,默认 true):是否将 active: false 的账号纳入审计输出
  • include_owner(布尔,可选,默认 false):是否将店铺所有者行纳入被标记账号统计
  • format(字符串,可选,默认 human):输出格式,human 或 json

安全说明:只读技能,不执行任何变更,可随时安全运行,不会停用或修改任何员工账号。

工作流步骤:

  1. 查询 staffMembers,输入 first: 250,选择 id、name、email、active、isShopOwner、accountType、locale、lastSeen、分页游标;分页直到 hasNextPage: false
  2. 计算每个成员的 days_since_last_seen,超过 stale_days 标记为 stale
  3. 将 active: false(或 accountType: SUSPENDED)标记为非活跃但仍被保留
  4. 将 isShopOwner: true 或拥有完整权限的 COLLABORATOR 标记为高权限,供审查
  5. 交叉汇总,生成包含全部标记的逐账号记录

GraphQL 操作(经 api_version 2025-01 验证):

query StaffAccountAudit($after: String) {
  staffMembers(first: 250, after: $after) {
    edges {
      node {
        id
        name
        email
        active
        isShopOwner
        accountType
        locale
        exists
        phone
        avatar {
          url
        }
        privateData {
          accountSettingsUrl
          createdAt
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}

会话跟踪输出(各阶段必须输出):

开始时输出:

╔══════════════════════════════════════════════╗
║  SKILL: Staff Account Audit                  ║
║  Store: <store domain>                       ║
║  Started: <YYYY-MM-DD HH:MM UTC>             ║
╚══════════════════════════════════════════════╝

每步之后输出:

[N/TOTAL] <QUERY|MUTATION>  <OperationName>
          → Params: <brief summary of key inputs>
          → Result: <count or outcome>

完成时输出。format: human(默认)时:

══════════════════════════════════════════════
STAFF ACCOUNT AUDIT  (stale threshold: <stale_days> days)
  Total staff accounts:   <n>
  Active:                 <n>
  Inactive (provisioned): <n>
  Stale logins (>Nd):     <n>  (<pct>%)
  High-privilege roles:   <n>

  Flagged accounts (top by risk):
    "<name>" <email>  last_seen: <Nd ago>  flags: <stale,high_priv>
  Output: staff_audit_<date>.csv
══════════════════════════════════════════════

format: json 时:

{
  "skill": "staff-account-audit",
  "store": "<domain>",
  "stale_days_threshold": 90,
  "total_accounts": 0,
  "active_accounts": 0,
  "inactive_accounts": 0,
  "stale_accounts": 0,
  "high_privilege_accounts": 0,
  "output_file": "staff_audit_<date>.csv"
}

输出格式

CSV 文件 staff_audit_<YYYY-MM-DD>.csv,列包含:staff_id, name, email, account_type, is_shop_owner, active, last_seen, days_since_last_seen, is_stale, is_inactive, is_high_privilege, flags。

错误处理

  • THROTTLED:API 速率超限,等待 2 秒,最多重试 3 次
  • staffMembers 上 ACCESS_DENIED:调用者缺少 read_users 或员工管理权限,以店铺所有者或员工管理员身份重新认证
  • 某员工 lastSeen: null:账号从未登录,按 days_since_account_created 视为 days_since_last_seen,并标记为 stale
  • 员工列表为空:单一运营者店铺(仅有所有者),以 1 行(所有者)退出,技能仍可用于记录

最佳实践

  • 按季度(90 天节奏)作为常规访问审查的一部分运行。配合离职清单使用——每位前员工都应被撤销,而不仅仅是被停用。
  • 高风险店铺(高流量、大团队)使用 stale_days: 30,非常小的团队可使用 stale_days: 180,此时季节性访问属正常。
  • 按 days_since_last_seen 降序排列 CSV,优先处理停滞最久的账号。
  • 高权限账号(店铺所有者、完整权限协作者)应使用唯一强凭证与 2FA——任何停滞的高权限账号都应视为 P0 审查项。
  • 将 CSV 导出到访问审查追踪器中;不要盲目停用账号——先与账号持有者的管理者确认。
  • 在回收前,将标记为 stale 的账号与近期的 staffMember 范围审计日志事件交叉比对,确保没有进行中的工作。

限制

以上资料未提供关于费用、价格、可用平台或具体效果的信息。