# 权限 SDK

用 AIDC 自己的账号体系做应用的**登录、身份、角色与分享**——不必自己写登录页、不必自己存用户。

```js
import { auth } from "/developer/sdk/v1/aidc.js";
```

## 登录与身份

Nexus 客户应用（`/nexus/<cellId>/apps/<应用>`）打开前，平台已经按会话把关：没登录跳 AIDC 登录页、登录后回到应用；不是这家公司的人（也没有被分享）看到 403。访客身份随**应用票据**下发，服务端按它裁决每一次读写——应用自己不用、也不能伪造身份。

```js
const v = auth.viewer();        // 同步读：{ name: "张三", role: "member", shared: false }（页面注入，用来显示）
const me = await auth.me();     // 服务端确认：账号、公司、角色、应用 / 通道 / 版本，以及语义层权限
// me.permissions = { read: [可读类型], actions: [能执行的 Action], write: [可直接写的类型], share: 能否分享 }
if (auth.can(me, { action: "production.flag_issue" })) showFlagButton();
```

## 角色

| 角色 | 谁 | 能做什么 |
| --- | --- | --- |
| `developer` | 本公司开发者（持 developer License 的账号、公司管理员、AIDC 平台员工） | 看全部；定义语义；直接改数据；分享；test 通道 |
| `member` | 本公司成员（持 member License 或公司账号） | 看清单登记的类型；执行 Action |
| `editor` | 经「指定账号」分享、角色为可改的人（可以是别家公司的人） | 同 member |
| `viewer` | 只读分享、公开链接的访客 | 只看 |
| `anonymous` | AIDC 官方公开应用的访客 | 只看公开数据 |

应用清单可以把应用收紧到只有开发者和被分享的人：

```json
{ "auth": { "access": "restricted" } }
```

缺省 `company`：本公司成员都能打开。Action 自己也可以限定角色（`roles`，见语义 SDK）。

只读访客想修改时：`auth.login()` 在新窗口打开 AIDC 登录页，登录后回到应用（沙箱里的应用不能跳转顶层页面）。

## 分享

```js
// 开发者：分享当前应用
await auth.share({ audience: "company", role: "editor" });                       // 本公司全员（restricted 应用靠它对全员开放）
await auth.share({ audience: "users", account: "li.si@example.com", role: "editor", expiresInDays: 30 }); // 指定账号，可跨公司
const { url } = await auth.share({ audience: "public" });                         // 公开链接：持链接的任何人，只读
const list = await auth.shares();                                                 // 当前应用的分享（公开链接只显示前缀）
await auth.revoke(list[0].id);                                                    // 撤销：链接 / 授权立即失效
```

- **公开链接**只读，完整地址只在创建时返回一次（库里只存哈希）。链接打开的是应用 production 通道的当前版本，不需要登录；想修改要登录并被分享为 editor。**分享的是真实数据**，发之前确认它可以对外。
- company / users 对同一对象再分享 = 改角色与有效期（幂等）；public 每次一条新链接。
- 每次分享、撤销都进审计（ActionLog）与日志 SDK（`kind: share`）。

```bash
aidc share tj8100-live --user li.si@example.com --role editor --days 30
aidc share tj8100-live --public
aidc share list tj8100-live
aidc share revoke <分享 id>
```

## 票据

浏览器 SDK 自动带票据、自动续期：客户应用的票据 8 小时有效，快到期时凭当前票据续一张（过期 24 小时内也能续，服务端会复核账号仍有权访问、分享仍然有效）。所以工厂大屏这种一直开着的看板不会过夜就断。

## API

| 方法 | 路径 | 说明 |
| --- | --- | --- |
| GET | `/api/v1/developer/auth/me` | 我是谁、什么角色、语义层权限 |
| GET / POST | `/api/v1/developer/shares` | 分享列表 / 分享（开发者） |
| DELETE | `/api/v1/developer/shares/{id}` | 撤销 |
| GET | `/nexus/s/{令牌}` | 公开链接落地页（只读） |
