40 lines
1016 B
Go
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)
|