@@ -7,6 +7,7 @@ package generate
77import (
88 "crypto/rand"
99 "encoding/base64"
10+ "fmt"
1011 "io"
1112 "time"
1213
@@ -38,19 +39,24 @@ func NewInternalToken() (string, error) {
3839 return internalToken , nil
3940}
4041
41- // NewJwtSecret generates a new value intended to be used for JWT secrets.
42- func NewJwtSecret () ([]byte , error ) {
43- bytes := make ([]byte , 32 )
44- _ , err := io .ReadFull (rand .Reader , bytes )
45- if err != nil {
42+ const defaultJwtSecretLen = 32
43+
44+ // DecodeJwtSecretBase64 decodes a base64 encoded jwt secret into bytes, and check its length
45+ func DecodeJwtSecretBase64 (src string ) ([]byte , error ) {
46+ encoding := base64 .RawURLEncoding
47+ decoded := make ([]byte , encoding .DecodedLen (len (src ))+ 3 )
48+ if n , err := encoding .Decode (decoded , []byte (src )); err != nil {
4649 return nil , err
50+ } else if n != defaultJwtSecretLen {
51+ return nil , fmt .Errorf ("invalid base64 decoded length: %d, expects: %d" , n , defaultJwtSecretLen )
4752 }
48- return bytes , nil
53+ return decoded [: defaultJwtSecretLen ] , nil
4954}
5055
51- // NewJwtSecretBase64 generates a new base64 encoded value intended to be used for JWT secrets.
52- func NewJwtSecretBase64 () ([]byte , string , error ) {
53- bytes , err := NewJwtSecret ()
56+ // NewJwtSecretWithBase64 generates a jwt secret with its base64 encoded value intended to be used for saving into config file
57+ func NewJwtSecretWithBase64 () ([]byte , string , error ) {
58+ bytes := make ([]byte , defaultJwtSecretLen )
59+ _ , err := io .ReadFull (rand .Reader , bytes )
5460 if err != nil {
5561 return nil , "" , err
5662 }
0 commit comments