Documentation
¶
Index ¶
- Constants
- Variables
- func ErrClientNotFound(clientID string) error
- type ExternalService
- func (c *ExternalService) GetAudience() fosite.Arguments
- func (c *ExternalService) GetGrantTypes() fosite.Arguments
- func (c *ExternalService) GetHashedSecret() []byte
- func (c *ExternalService) GetID() string
- func (c *ExternalService) GetRedirectURIs() []string
- func (c *ExternalService) GetResponseTypes() fosite.Arguments
- func (c *ExternalService) GetScopes() fosite.Arguments
- func (c *ExternalService) GetScopesOnUser(ctx context.Context, accessControl ac.AccessControl, userID int64) []string
- func (c *ExternalService) IsPublic() bool
- func (c *ExternalService) LogID() string
- func (c *ExternalService) ToDTO() *ExternalServiceDTO
- type ExternalServiceDTO
- type ExternalServiceRegistration
- type ImpersonationCfg
- type KeyOption
- type KeyResult
- type OAuth2Server
- type SelfCfg
- type Store
Constants ¶
const ( // TmpOrgID is the orgID we use while global service accounts are not supported. TmpOrgID int64 = 1 // NoServiceAccountID is the ID we use for client that have no service account associated. NoServiceAccountID int64 = 0 // List of scopes used to identify the impersonated user. ScopeUsersSelf = "users:self" ScopeGlobalUsersSelf = "global.users:self" ScopeTeamsSelf = "teams:self" // Supported encryptions RS256 = "RS256" ES256 = "ES256" )
Variables ¶
var ( ErrClientRequiredID = errutil.NewBase(errutil.StatusBadRequest, "oauthserver.required-client-id", errutil.WithPublicMessage("client ID is required")).Errorf("Client ID is required") ErrClientRequiredName = errutil.NewBase(errutil.StatusBadRequest, "oauthserver.required-client-name", errutil.WithPublicMessage("client name is required")).Errorf("Client name is required") )
var (
ErrClientNotFoundMessageID = "oauthserver.client-not-found"
)
Functions ¶
func ErrClientNotFound ¶
Types ¶
type ExternalService ¶
type ExternalService struct {
ID int64 `xorm:"id pk autoincr"`
Name string `xorm:"name"`
ClientID string `xorm:"client_id"`
Secret string `xorm:"secret"`
RedirectURI string `xorm:"redirect_uri"` // Not used yet (code flow)
GrantTypes string `xorm:"grant_types"` // CSV value
Audiences string `xorm:"audiences"` // CSV value
PublicPem []byte `xorm:"public_pem"`
ServiceAccountID int64 `xorm:"service_account_id"`
// SelfPermissions are the registered service account permissions (registered and managed permissions)
SelfPermissions []ac.Permission
// ImpersonatePermissions is the restriction set of permissions while impersonating
ImpersonatePermissions []ac.Permission
// SignedInUser refers to the current Service Account identity/user
SignedInUser *user.SignedInUser
Scopes []string
ImpersonateScopes []string
}
func (*ExternalService) GetAudience ¶
func (c *ExternalService) GetAudience() fosite.Arguments
GetAudience returns the allowed audience(s) for this client.
func (*ExternalService) GetGrantTypes ¶
func (c *ExternalService) GetGrantTypes() fosite.Arguments
GetGrantTypes returns the client's allowed grant types.
func (*ExternalService) GetHashedSecret ¶
func (c *ExternalService) GetHashedSecret() []byte
GetHashedSecret returns the hashed secret as it is stored in the store.
func (*ExternalService) GetID ¶
func (c *ExternalService) GetID() string
GetID returns the client ID.
func (*ExternalService) GetRedirectURIs ¶
func (c *ExternalService) GetRedirectURIs() []string
GetRedirectURIs returns the client's allowed redirect URIs.
func (*ExternalService) GetResponseTypes ¶
func (c *ExternalService) GetResponseTypes() fosite.Arguments
GetResponseTypes returns the client's allowed response types. All allowed combinations of response types have to be listed, each combination having response types of the combination separated by a space.
func (*ExternalService) GetScopes ¶
func (c *ExternalService) GetScopes() fosite.Arguments
GetScopes returns the scopes this client is allowed to request on its own behalf.
func (*ExternalService) GetScopesOnUser ¶
func (c *ExternalService) GetScopesOnUser(ctx context.Context, accessControl ac.AccessControl, userID int64) []string
GetScopes returns the scopes this client is allowed to request on a specific user.
func (*ExternalService) IsPublic ¶
func (c *ExternalService) IsPublic() bool
IsPublic returns true, if this client is marked as public.
func (*ExternalService) LogID ¶
func (c *ExternalService) LogID() string
func (*ExternalService) ToDTO ¶
func (c *ExternalService) ToDTO() *ExternalServiceDTO
type ExternalServiceDTO ¶
type ExternalServiceDTO struct {
Name string `json:"name"`
ID string `json:"clientId"`
Secret string `json:"clientSecret"`
RedirectURI string `json:"redirectUri,omitempty"` // Not used yet (code flow)
GrantTypes string `json:"grantTypes"` // CSV value
Audiences string `json:"audiences"` // CSV value
KeyResult *KeyResult `json:"key,omitempty"`
}
type ExternalServiceRegistration ¶
type ExternalServiceRegistration struct {
Name string `json:"name"`
// RedirectURI is the URI that is used in the code flow.
// Note that this is not used yet.
RedirectURI *string `json:"redirectUri,omitempty"`
// Impersonation access configuration
Impersonation ImpersonationCfg `json:"impersonation"`
// Self access configuration
Self SelfCfg `json:"self"`
// Key is the option to specify a public key or ask the server to generate a crypto key pair.
Key *KeyOption `json:"key,omitempty"`
}
ExternalServiceRegistration represents the registration form to save new OAuth2 client.
type ImpersonationCfg ¶
type ImpersonationCfg struct {
// Enabled allows the service to request access tokens to impersonate users using the jwtbearer grant
Enabled bool `json:"enabled"`
// Groups allows the service to list the impersonated user's teams
Groups bool `json:"groups"`
// Permissions are the permissions that the external service needs when impersonating a user.
// The intersection of this set with the impersonated user's permission guarantees that the client will not
// gain more privileges than the impersonated user has.
Permissions []accesscontrol.Permission `json:"permissions,omitempty"`
}
type OAuth2Server ¶
type OAuth2Server interface {
// SaveExternalService creates or updates an external service in the database, it generates client_id and secrets and
// it ensures that the associated service account has the correct permissions.
SaveExternalService(ctx context.Context, cmd *ExternalServiceRegistration) (*ExternalServiceDTO, error)
// GetExternalService retrieves an external service from store by client_id. It populates the SelfPermissions and
// SignedInUser from the associated service account.
GetExternalService(ctx context.Context, id string) (*ExternalService, error)
// HandleTokenRequest handles the client's OAuth2 query to obtain an access_token by presenting its authorization
// grant (ex: client_credentials, jwtbearer).
HandleTokenRequest(rw http.ResponseWriter, req *http.Request)
// HandleIntrospectionRequest handles the OAuth2 query to determine the active state of an OAuth 2.0 token and
// to determine meta-information about this token.
HandleIntrospectionRequest(rw http.ResponseWriter, req *http.Request)
}
OAuth2Server represents a service in charge of managing OAuth2 clients and handling OAuth2 requests (token, introspection).
type SelfCfg ¶
type SelfCfg struct {
// Enabled allows the service to request access tokens for itself using the client_credentials grant
Enabled bool `json:"enabled"`
// Permissions are the permissions that the external service needs its associated service account to have.
Permissions []accesscontrol.Permission `json:"permissions,omitempty"`
}
type Store ¶
type Store interface {
RegisterExternalService(ctx context.Context, client *ExternalService) error
SaveExternalService(ctx context.Context, client *ExternalService) error
GetExternalService(ctx context.Context, id string) (*ExternalService, error)
GetExternalServiceByName(ctx context.Context, name string) (*ExternalService, error)
GetExternalServicePublicKey(ctx context.Context, clientID string) (*jose.JSONWebKey, error)
}