密钥、令牌和名称都是虚构的测试值(密钥是 RFC 8032 公布的测试密钥),绝非真实。
逐字节的签名请求
以密钥配对的设备会为每个带令牌的请求签名。服务器根据请求重建签名基,并用绑定到该令牌的密钥校验签名。
发送的请求
GET /api/lantern/v1/apps?page_size=50 HTTP/1.1
Host: shelf.example.org
Authorization: Bearer et_c8V1nQ0xYbExampleVectorToken0000000000
Signature-Input: lantern=("@method" "@target-uri" "authorization");created=1793345400;nonce="tQ0Vb3Yt7sXx2c1mZ8kq4A";keyid="If4x36FUomFia_hUBG_SJxt77UtqvkWqWId-9H-XIbk";alg="ed25519"
Signature: lantern=:M8AuwRfGqDSUYUefbsIOlmFKxvi+6HnHv0pvbD22n/lrJqHvPcvYThUUCqK+6C63s9nTQPThdrTfM9yFwt6aBA==:
设备所签名的签名基
"@method": GET
"@target-uri": https://shelf.example.org/api/lantern/v1/apps?page_size=50
"authorization": Bearer et_c8V1nQ0xYbExampleVectorToken0000000000
"@signature-params": ("@method" "@target-uri" "authorization");created=1793345400;nonce="tQ0Vb3Yt7sXx2c1mZ8kq4A";keyid="If4x36FUomFia_hUBG_SJxt77UtqvkWqWId-9H-XIbk";alg="ed25519"
设备的密钥
private key (seed): 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60
public key: 11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=
keyid: If4x36FUomFia_hUBG_SJxt77UtqvkWqWId-9H-XIbk
short fingerprint: 21FE 31DF A154 A261
没有签名的同一请求
Authorization: Bearer et_c8V1nQ0xYbExampleVectorToken0000000000
→ 401 · signature_required
从代码到令牌的配对
设备请求并显示代码;其所有者在已登录服务器的另一台设备上批准;设备轮询直到令牌被一次性给出。
1. 设备请求配对
POST /api/lantern/v1/pairing HTTP/1.1 Host: shelf.example.org Content-Type: application/json { "schema": 1, "device": "Lea's Switch", "scopes": [ "library", "saves" ], "key": { "alg": "ed25519", "public_key": "11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=" } }2. 服务器返回代码
HTTP/1.1 200 OK Content-Type: application/json { "schema": 1, "code": "KQ4M-7TXD", "verify": "https://shelf.example.org/pair", "verify_complete": "https://shelf.example.org/pair?code=KQ4M-7TXD", "poll": "/api/lantern/v1/pairing/p_4Fh2", "interval": 5, "expires": 600 }3. 所有者批准,设备轮询
GET /api/lantern/v1/pairing/p_4Fh2 HTTP/1.1 Host: shelf.example.org Signature-Input: lantern=("@method" "@target-uri");created=…;nonce="…";keyid="…";alg="ed25519" Signature: lantern=:…:4. 令牌,仅一次
HTTP/1.1 200 OK Content-Type: application/json { "schema": 1, "token": "et_c8V1nQ0xYb", "scopes": [ "library", "saves" ], "bound": true, "rating_cap": { "system": "PEGI", "rating": "12" } }
给对等主机的授权
服务器签署一条简短声明:某客户端可读取某个文件;持有该文件的对等主机用服务器的公钥校验,无需询问任何人。
服务器所签署的内容(JSON,键按此顺序,无空格)
{"exp":1793346000,"purpose":"lantern-grant-1","sha256":"3a7bd3e2b4c1f0a9e8d7c6b5a4938271605f4e3d2c1b0a9f8e7d6c5b4a392817","size":734003200,"uid":"6f1c2a8e-4b7d-4e2a-9c31-8d5e2f0a7b14"}
授权:载荷及其签名,各为 base64url
eyJleHAiOjE3OTMzNDYwMDAsInB1cnBvc2UiOiJsYW50ZXJuLWdyYW50LTEiLCJzaGEyNTYiOiIzYTdiZDNlMmI0YzFmMGE5ZThkN2M2YjVhNDkzODI3MTYwNWY0ZTNkMmMxYjBhOWY4ZTdkNmM1YjRhMzkyODE3Iiwic2l6ZSI6NzM0MDAzMjAwLCJ1aWQiOiI2ZjFjMmE4ZS00YjdkLTRlMmEtOWMzMS04ZDVlMmYwYTdiMTQifQ.-4SQt-G8QN_sjMzKfaBGDl7b7Z-tW2qHaeC8bSwe70tHH4lVsyhxnMVMrb3r4y3RVBzbhOTeWdP4d6jFjex5Bg
public key (peers.key): FkDVKwFG57y5KAWiHAahZeQ1pO2FxI5AehF/nZjLXq8=