dudu MVP:五端语音输入法初始提交
- 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>
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user