75 lines
2.2 KiB
Go
75 lines
2.2 KiB
Go
package tokenexchange
|
|
|
|
const (
|
|
AccessTokenType = "urn:ietf:params:oauth:token-type:access_token"
|
|
RefreshTokenType = "urn:ietf:params:oauth:token-type:refresh_token"
|
|
IDTokenType = "urn:ietf:params:oauth:token-type:id_token"
|
|
JWTTokenType = "urn:ietf:params:oauth:token-type:jwt"
|
|
DelegationTokenType = AccessTokenType
|
|
|
|
TokenExchangeGrantType = "urn:ietf:params:oauth:grant-type:token-exchange"
|
|
)
|
|
|
|
type TokenExchangeRequest struct {
|
|
grantType string `schema:"grant_type"`
|
|
subjectToken string `schema:"subject_token"`
|
|
subjectTokenType string `schema:"subject_token_type"`
|
|
actorToken string `schema:"actor_token"`
|
|
actorTokenType string `schema:"actor_token_type"`
|
|
resource []string `schema:"resource"`
|
|
audience []string `schema:"audience"`
|
|
scope []string `schema:"scope"`
|
|
requestedTokenType string `schema:"requested_token_type"`
|
|
}
|
|
|
|
func NewTokenExchangeRequest(subjectToken, subjectTokenType string, opts ...TokenExchangeOption) *TokenExchangeRequest {
|
|
t := &TokenExchangeRequest{
|
|
grantType: TokenExchangeGrantType,
|
|
subjectToken: subjectToken,
|
|
subjectTokenType: subjectTokenType,
|
|
requestedTokenType: AccessTokenType,
|
|
}
|
|
for _, opt := range opts {
|
|
opt(t)
|
|
}
|
|
return t
|
|
}
|
|
|
|
type TokenExchangeOption func(*TokenExchangeRequest)
|
|
|
|
func WithActorToken(token, tokenType string) func(*TokenExchangeRequest) {
|
|
return func(req *TokenExchangeRequest) {
|
|
req.actorToken = token
|
|
req.actorTokenType = tokenType
|
|
}
|
|
}
|
|
|
|
func WithAudience(audience []string) func(*TokenExchangeRequest) {
|
|
return func(req *TokenExchangeRequest) {
|
|
req.audience = audience
|
|
}
|
|
}
|
|
|
|
func WithGrantType(grantType string) TokenExchangeOption {
|
|
return func(req *TokenExchangeRequest) {
|
|
req.grantType = grantType
|
|
}
|
|
}
|
|
|
|
func WithRequestedTokenType(tokenType string) func(*TokenExchangeRequest) {
|
|
return func(req *TokenExchangeRequest) {
|
|
req.requestedTokenType = tokenType
|
|
}
|
|
}
|
|
|
|
func WithResource(resource []string) func(*TokenExchangeRequest) {
|
|
return func(req *TokenExchangeRequest) {
|
|
req.resource = resource
|
|
}
|
|
}
|
|
|
|
func WithScope(scope []string) func(*TokenExchangeRequest) {
|
|
return func(req *TokenExchangeRequest) {
|
|
req.scope = scope
|
|
}
|
|
}
|