用途
对店铺内所有员工账号进行审计,暴露安全与访问卫生风险。标记超过 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
安全说明:只读技能,不执行任何变更,可随时安全运行,不会停用或修改任何员工账号。
工作流步骤:
- 查询 staffMembers,输入 first: 250,选择 id、name、email、active、isShopOwner、accountType、locale、lastSeen、分页游标;分页直到 hasNextPage: false
- 计算每个成员的 days_since_last_seen,超过 stale_days 标记为 stale
- 将 active: false(或 accountType: SUSPENDED)标记为非活跃但仍被保留
- 将 isShopOwner: true 或拥有完整权限的 COLLABORATOR 标记为高权限,供审查
- 交叉汇总,生成包含全部标记的逐账号记录
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 范围审计日志事件交叉比对,确保没有进行中的工作。
限制
以上资料未提供关于费用、价格、可用平台或具体效果的信息。