forked from grafana/grafana
-
Notifications
You must be signed in to change notification settings - Fork 0
/
apikeygen.go
58 lines (44 loc) · 1.15 KB
/
apikeygen.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package apikeygen
import (
"encoding/base64"
"encoding/json"
"errors"
"github.com/grafana/grafana/pkg/util"
)
var ErrInvalidApiKey = errors.New("Invalid Api Key")
type KeyGenResult struct {
HashedKey string
ClientSecret string
}
type ApiKeyJson struct {
Key string `json:"k"`
Name string `json:"n"`
OrgId int64 `json:"id"`
}
func New(orgId int64, name string) KeyGenResult {
jsonKey := ApiKeyJson{}
jsonKey.OrgId = orgId
jsonKey.Name = name
jsonKey.Key = util.GetRandomString(32)
result := KeyGenResult{}
result.HashedKey = util.EncodePassword(jsonKey.Key, name)
jsonString, _ := json.Marshal(jsonKey)
result.ClientSecret = base64.StdEncoding.EncodeToString([]byte(jsonString))
return result
}
func Decode(keyString string) (*ApiKeyJson, error) {
jsonString, err := base64.StdEncoding.DecodeString(keyString)
if err != nil {
return nil, ErrInvalidApiKey
}
var keyObj ApiKeyJson
err = json.Unmarshal([]byte(jsonString), &keyObj)
if err != nil {
return nil, ErrInvalidApiKey
}
return &keyObj, nil
}
func IsValid(key *ApiKeyJson, hashedKey string) bool {
check := util.EncodePassword(key.Key, key.Name)
return check == hashedKey
}