40760aa884
- server:Go 网关(WS 流式识别中继/计费配额/微信登录支付 mock/反馈/埋点),gummy provider 已真实联调 - desktop:Tauri 2(全局快捷键 push-to-talk/浮层/托盘/设置/登录购买/反馈/首启引导) - android:Compose 主 App + IME(键盘内录音直传) - ios:App + 键盘扩展(1A spike 实证键盘内不可录音,走 deep link 听写) - design/design-pipeline:设计系统 + token 导出 iOS/Android 主题 - doc:前后端设计文档(HTML);web:官网宣传页;todo:任务看板 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
40 lines
888 B
Go
40 lines
888 B
Go
package auth
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/alicebob/miniredis/v2"
|
|
"github.com/redis/go-redis/v9"
|
|
)
|
|
|
|
func TestSignParseRevoke(t *testing.T) {
|
|
mr := miniredis.RunT(t)
|
|
rdb := redis.NewClient(&redis.Options{Addr: mr.Addr()})
|
|
j := NewJWT("test-secret", time.Hour, rdb)
|
|
ctx := context.Background()
|
|
|
|
token, err := j.Sign("u1")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
uid, jti, err := j.Parse(ctx, token)
|
|
if err != nil || uid != "u1" || jti == "" {
|
|
t.Fatalf("parse failed: uid=%s jti=%s err=%v", uid, jti, err)
|
|
}
|
|
|
|
// 拉黑后解析失败
|
|
if err := j.Revoke(ctx, jti, time.Now().Add(time.Hour)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, _, err := j.Parse(ctx, token); err == nil {
|
|
t.Fatal("expect parse failure after revoke")
|
|
}
|
|
|
|
// 篡改签名失败
|
|
if _, _, err := j.Parse(ctx, token+"x"); err == nil {
|
|
t.Fatal("expect parse failure on tampered token")
|
|
}
|
|
}
|