Files

40 lines
1016 B
Go

package admin
import (
"context"
"crypto/rand"
"crypto/sha256"
"encoding/base64"
"strings"
"git.asio.asia/nixevol/NixMsg/internal/auth"
)
// RandomAPITokens 生成真实 nxm_ 令牌(P3 合入前供 A1 使用)。
// 哈希为 SHA-256 原始字节,与 DEVELOPMENT 一致。
type RandomAPITokens struct{}
// NewRandomAPITokens 返回可注入的 APITokens 实现。
func NewRandomAPITokens() *RandomAPITokens { return &RandomAPITokens{} }
func (RandomAPITokens) Issue(_ context.Context) (string, []byte, error) {
buf := make([]byte, 32)
if _, err := rand.Read(buf); err != nil {
return "", nil, err
}
tok := "nxm_" + base64.RawURLEncoding.EncodeToString(buf)
sum := sha256.Sum256([]byte(tok))
return tok, sum[:], nil
}
func (RandomAPITokens) HashToken(token string) []byte {
sum := sha256.Sum256([]byte(token))
return sum[:]
}
func (RandomAPITokens) LooksLikeAPIToken(credential string) bool {
return strings.HasPrefix(credential, "nxm_")
}
var _ auth.APITokens = (*RandomAPITokens)(nil)