2021-10-29 23:37:05 +02:00
|
|
|
package token
|
|
|
|
|
2023-03-22 04:04:22 +01:00
|
|
|
import (
|
|
|
|
"errors"
|
2023-05-14 21:14:59 +02:00
|
|
|
"os"
|
2023-03-22 04:04:22 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
var ErrUsernameRequired = errors.New("username required")
|
|
|
|
|
2023-03-22 00:07:13 +01:00
|
|
|
type Token interface {
|
|
|
|
Check(host, group string, username *string) (string, []string, error)
|
2022-02-20 01:04:16 +01:00
|
|
|
}
|
|
|
|
|
2023-03-22 00:07:13 +01:00
|
|
|
func Parse(token string, keys []map[string]interface{}) (Token, error) {
|
2023-05-14 21:14:59 +02:00
|
|
|
// both getStateful and parseJWT may return nil, which we
|
|
|
|
// shouldn't cast into an interface. Be very careful.
|
|
|
|
s, err1 := getStateful(token)
|
|
|
|
if err1 == nil && s != nil {
|
|
|
|
return s, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
jwt, err2 := parseJWT(token, keys)
|
|
|
|
if err2 == nil && jwt != nil {
|
|
|
|
return jwt, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if err1 != nil {
|
|
|
|
return nil, err1
|
|
|
|
} else if err2 != nil {
|
|
|
|
return nil, err2
|
|
|
|
} else {
|
|
|
|
return nil, os.ErrNotExist
|
2023-03-22 04:04:22 +01:00
|
|
|
}
|
2021-10-29 23:37:05 +02:00
|
|
|
}
|