You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.4 KiB
63 lines
1.4 KiB
1 year ago
|
package jwt
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"git.diulo.com/mogfee/kit/errors"
|
||
|
"git.diulo.com/mogfee/kit/transport"
|
||
|
"git.diulo.com/mogfee/kit/transport/http"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type jwtDefault struct {
|
||
|
}
|
||
|
|
||
|
func (j *jwtDefault) GetToken(ctx context.Context, key string) (tokenStr string) {
|
||
|
arr := strings.Split(key, ":")
|
||
|
if len(arr) != 2 {
|
||
|
return ""
|
||
|
}
|
||
|
switch arr[0] {
|
||
|
case "cookie":
|
||
|
if tr, ok := transport.FromServerContext(ctx); ok {
|
||
|
if tr1, ok := tr.(http.Transporter); ok {
|
||
|
if co, err := tr1.Request().Cookie(arr[1]); err == nil {
|
||
|
return co.Value
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
case "header":
|
||
|
if tr, ok := transport.FromServerContext(ctx); ok {
|
||
|
return tr.RequestHeader().Get(arr[1])
|
||
|
}
|
||
|
case "query":
|
||
|
if tr, ok := transport.FromServerContext(ctx); ok {
|
||
|
if ht, ok := tr.(http.Transporter); ok {
|
||
|
return ht.Request().URL.Query().Get(arr[1])
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
func (j *jwtDefault) ParseToken(ctx context.Context, key string, token string) (*UserInfo, error) {
|
||
|
userInfo, err := Parse(key, token)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return userInfo, nil
|
||
|
}
|
||
|
|
||
|
func (j *jwtDefault) Validate(ctx context.Context, permission string, permissions []string) error {
|
||
|
allowPers := strings.Split(permission, "|")
|
||
|
allowMap := make(map[string]bool, len(allowPers))
|
||
|
for _, v := range allowPers {
|
||
|
allowMap[v] = true
|
||
|
}
|
||
|
for _, v := range permissions {
|
||
|
if allowMap[v] {
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
return errors.Unauthorized("TOKEN_PERMISSION_BAD", "")
|
||
|
}
|