60 lines
1.8 KiB
Go
60 lines
1.8 KiB
Go
package lightwave
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"strings"
|
|
)
|
|
|
|
type JWTToken struct {
|
|
TokenId string `json:"jti"`
|
|
Algorithm string `json:"alg"`
|
|
Subject string `json:"sub"`
|
|
Audience []string `json:"aud"`
|
|
Groups []string `json:"groups"`
|
|
Issuer string `json:"iss"`
|
|
IssuedAt int64 `json:"iat"`
|
|
Expires int64 `json:"exp"`
|
|
Scope string `json:"scope"`
|
|
TokenType string `json:"token_type"`
|
|
TokenClass string `json:"token_class"`
|
|
Tenant string `json:"tenant"`
|
|
// It's possible to have more fields depending on how Lightwave defines the token.
|
|
// This covers all the fields we currently have.
|
|
}
|
|
|
|
// A JSON web token is a set of Base64 encoded strings separated by a period (.)
|
|
// When decoded, it will either be JSON text or a signature
|
|
// Here we decode the strings into a single token structure. We do not parse the signature.
|
|
func ParseTokenDetails(token string) (jwtToken *JWTToken) {
|
|
jwtToken = &JWTToken{}
|
|
|
|
chunks := strings.Split(token, ".")
|
|
for _, chunk := range chunks {
|
|
json_string, err := base64.RawURLEncoding.DecodeString(chunk)
|
|
if err == nil {
|
|
// Ignore errors. We expect that the signature is not JSON,
|
|
// so unmarshalling it will fail. That's fine. We'll extract
|
|
// all the data we can.
|
|
_ = json.Unmarshal(json_string, &jwtToken)
|
|
}
|
|
}
|
|
|
|
return jwtToken
|
|
}
|
|
|
|
// A JSON web token is a set of Base64 encoded strings separated by a period (.)
|
|
// When decoded, it will either be JSON text or a signature
|
|
// Here we parse the full JSON text. We do not parse the signature.
|
|
func ParseRawTokenDetails(token string) (jwtToken []string, err error) {
|
|
chunks := strings.Split(token, ".")
|
|
for _, chunk := range chunks {
|
|
jsonString, err := base64.RawURLEncoding.DecodeString(chunk)
|
|
if err == nil {
|
|
jwtToken = append(jwtToken, string(jsonString))
|
|
}
|
|
}
|
|
|
|
return jwtToken, err
|
|
}
|