# `LibOss.Core.Token`
[🔗](https://github.com/tt67wq/lib-oss/blob/main/lib/lib_oss/core/token.ex#L1)

Token生成模块

负责：
- Web上传令牌：get_token
- 策略和签名生成

# `err_t`

```elixir
@type err_t() :: {:error, LibOss.Exception.t()}
```

# `content_length_range`

```elixir
@spec content_length_range(non_neg_integer(), non_neg_integer()) :: list()
```

创建文件大小限制条件

## 参数
- min_size: 最小文件大小（字节）
- max_size: 最大文件大小（字节）

## 返回值
- list()

## 示例
    iex> LibOss.Core.Token.content_length_range(1024, 10485760)
    ["content-length-range", 1024, 10485760]

# `content_type_condition`

```elixir
@spec content_type_condition(binary()) :: list()
```

创建内容类型条件

## 参数
- content_type: MIME类型

## 返回值
- list()

## 示例
    iex> LibOss.Core.Token.content_type_condition("image/jpeg")
    ["eq", "$content-type", "image/jpeg"]

# `get_token`

```elixir
@spec get_token(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.object(),
  non_neg_integer(),
  binary()
) :: {:ok, binary()} | err_t()
```

生成Web上传令牌

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称前缀
- expire_sec: 过期时间（秒，默认3600秒）
- callback: 回调URL（可选）

## 返回值
- `{:ok, binary()} | {:error, Exception.t()}`

返回JSON格式的上传令牌，包含：
- accessid: 访问密钥ID
- host: 上传主机URL
- policy: Base64编码的策略
- signature: 签名
- expire: 过期时间戳
- dir: 对象前缀
- callback: Base64编码的回调信息

## 示例
    iex> LibOss.Core.Token.get_token(MyOss, "my-bucket", "uploads/", 3600, "https://example.com/callback")
    {:ok, "{"accessid":"...","host":"https://my-bucket.oss-cn-hangzhou.aliyuncs.com","policy":"...","signature":"...","expire":1640995200,"dir":"uploads/","callback":"..."}"}

## 相关文档
https://help.aliyun.com/document_detail/31926.html

# `get_token_with_policy`

```elixir
@spec get_token_with_policy(
  module(),
  LibOss.Typespecs.bucket(),
  list(),
  non_neg_integer(),
  binary()
) ::
  {:ok, binary()} | err_t()
```

生成自定义策略的上传令牌

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- policy_conditions: 策略条件列表
- expire_sec: 过期时间（秒，默认3600秒）
- callback: 回调URL（可选）

## 策略条件示例
    [
      ["starts-with", "$key", "uploads/"],
      ["content-length-range", 1, 10485760],
      ["eq", "$content-type", "image/jpeg"]
    ]

## 返回值
- `{:ok, binary()} | {:error, Exception.t()}`

## 示例
    iex> conditions = [["starts-with", "$key", "photos/"], ["content-length-range", 1, 5242880]]
    iex> LibOss.Core.Token.get_token_with_policy(MyOss, "my-bucket", conditions, 3600)
    {:ok, "{"accessid":"...","host":"...","policy":"...","signature":"...","expire":1640995200,"dir":"","callback":""}"}

# `parse_token`

```elixir
@spec parse_token(binary()) :: {:ok, map()} | err_t()
```

解析上传令牌信息

## 参数
- token: 令牌JSON字符串

## 返回值
- `{:ok, map()} | {:error, Exception.t()}`

## 示例
    iex> LibOss.Core.Token.parse_token(token_json)
    {:ok, %{
      "accessid" => "...",
      "host" => "https://...",
      "expire" => 1640995200,
      "dir" => "uploads/"
    }}

# `starts_with_condition`

```elixir
@spec starts_with_condition(binary()) :: list()
```

创建键前缀条件

## 参数
- prefix: 对象键前缀

## 返回值
- list()

## 示例
    iex> LibOss.Core.Token.starts_with_condition("uploads/images/")
    ["starts-with", "$key", "uploads/images/"]

# `token_expired?`

```elixir
@spec token_expired?(binary()) :: boolean()
```

验证上传令牌是否过期

## 参数
- token: 令牌JSON字符串

## 返回值
- boolean()

## 示例
    iex> LibOss.Core.Token.token_expired?(token_json)
    false

# `token_remaining_time`

```elixir
@spec token_remaining_time(binary()) :: {:ok, non_neg_integer()} | err_t()
```

获取令牌剩余有效时间（秒）

## 参数
- token: 令牌JSON字符串

## 返回值
- `{:ok, non_neg_integer()} | {:error, Exception.t()}`

如果令牌已过期，返回0

## 示例
    iex> LibOss.Core.Token.token_remaining_time(token_json)
    {:ok, 3540}

---

*Consult [api-reference.md](api-reference.md) for complete listing*
