pkg/client/keycloak/adapter/identity_provider.go (157 lines of code) (raw):
package adapter
import (
"context"
"net/http"
"github.com/pkg/errors"
)
type IdentityProvider struct {
ProviderID string `json:"providerId"`
Config map[string]string `json:"config"`
AddReadTokenRoleOnCreate bool `json:"addReadTokenRoleOnCreate"`
Alias string `json:"alias"`
AuthenticateByDefault bool `json:"authenticateByDefault"`
DisplayName string `json:"displayName"`
Enabled bool `json:"enabled"`
FirstBrokerLoginFlowAlias string `json:"firstBrokerLoginFlowAlias"`
LinkOnly bool `json:"linkOnly"`
StoreToken bool `json:"storeToken"`
TrustEmail bool `json:"trustEmail"`
}
type IdentityProviderMapper struct {
ID string `json:"id,omitempty"`
IdentityProviderAlias string `json:"identityProviderAlias"`
IdentityProviderMapper string `json:"identityProviderMapper"`
Name string `json:"name"`
Config map[string]string `json:"config"`
}
func (a GoCloakAdapter) CreateIdentityProvider(ctx context.Context, realm string, idp *IdentityProvider) error {
rsp, err := a.startRestyRequest().
SetContext(ctx).
SetPathParams(map[string]string{
keycloakApiParamRealm: realm,
}).
SetBody(idp).
Post(a.buildPath(identityProviderCreateList))
if err = a.checkError(err, rsp); err != nil {
return errors.Wrap(err, "unable to create idp")
}
return nil
}
func (a GoCloakAdapter) UpdateIdentityProvider(ctx context.Context, realm string, idp *IdentityProvider) error {
rsp, err := a.startRestyRequest().
SetContext(ctx).
SetPathParams(map[string]string{
keycloakApiParamRealm: realm,
keycloakApiParamAlias: idp.Alias,
}).
SetBody(idp).
Put(a.buildPath(identityProviderEntity))
if err = a.checkError(err, rsp); err != nil {
return errors.Wrap(err, "unable to update idp")
}
return nil
}
func (a GoCloakAdapter) GetIdentityProvider(ctx context.Context, realm, alias string) (*IdentityProvider, error) {
var idp IdentityProvider
rsp, err := a.startRestyRequest().
SetContext(ctx).
SetPathParams(map[string]string{
keycloakApiParamRealm: realm,
keycloakApiParamAlias: alias,
}).
SetResult(&idp).
Get(a.buildPath(identityProviderEntity))
if err = a.checkError(err, rsp); err != nil {
if rsp.StatusCode() == http.StatusNotFound {
return nil, NotFoundError("idp not found")
}
return nil, errors.Wrap(err, "unable to get idp")
}
return &idp, nil
}
func (a GoCloakAdapter) IdentityProviderExists(ctx context.Context, realm, alias string) (bool, error) {
_, err := a.GetIdentityProvider(ctx, realm, alias)
if err != nil {
if IsErrNotFound(err) {
return false, nil
}
return false, errors.Wrap(err, "unable to get idp, unexpected error")
}
return true, nil
}
func (a GoCloakAdapter) DeleteIdentityProvider(ctx context.Context, realm, alias string) error {
rsp, err := a.startRestyRequest().
SetContext(ctx).
SetPathParams(map[string]string{
keycloakApiParamRealm: realm,
keycloakApiParamAlias: alias,
}).
Delete(a.buildPath(identityProviderEntity))
if err = a.checkError(err, rsp); err != nil {
return errors.Wrap(err, "unable to delete idp")
}
return nil
}
func (a GoCloakAdapter) CreateIDPMapper(ctx context.Context, realm, idpAlias string,
mapper *IdentityProviderMapper) (string, error) {
rsp, err := a.startRestyRequest().
SetContext(ctx).
SetPathParams(map[string]string{
keycloakApiParamRealm: realm,
keycloakApiParamAlias: idpAlias,
}).
SetBody(mapper).
Post(a.buildPath(idpMapperCreateList))
if err = a.checkError(err, rsp); err != nil {
return "", errors.Wrap(err, "unable to create idp mapper")
}
id, err := getIDFromResponseLocation(rsp.RawResponse)
if err != nil {
return "", errors.Wrap(err, "no id in response")
}
return id, nil
}
func (a GoCloakAdapter) UpdateIDPMapper(ctx context.Context, realm, idpAlias string, mapper *IdentityProviderMapper) error {
rsp, err := a.startRestyRequest().
SetContext(ctx).
SetPathParams(map[string]string{
keycloakApiParamRealm: realm,
keycloakApiParamAlias: idpAlias,
keycloakApiParamId: mapper.ID,
}).
SetBody(mapper).
Put(a.buildPath(idpMapperEntity))
if err = a.checkError(err, rsp); err != nil {
return errors.Wrap(err, "unable to update idp mapper")
}
return nil
}
func (a GoCloakAdapter) DeleteIDPMapper(ctx context.Context, realm, idpAlias, mapperID string) error {
rsp, err := a.startRestyRequest().
SetContext(ctx).
SetPathParams(map[string]string{
keycloakApiParamRealm: realm,
keycloakApiParamAlias: idpAlias,
keycloakApiParamId: mapperID,
}).
Delete(a.buildPath(idpMapperEntity))
if err = a.checkError(err, rsp); err != nil {
return errors.Wrap(err, "unable to delete idp mapper")
}
return nil
}
func (a GoCloakAdapter) GetIDPMappers(ctx context.Context, realm, idpAlias string) ([]IdentityProviderMapper, error) {
var res []IdentityProviderMapper
rsp, err := a.startRestyRequest().
SetContext(ctx).
SetPathParams(map[string]string{
keycloakApiParamRealm: realm,
keycloakApiParamAlias: idpAlias,
}).
SetResult(&res).
Get(a.buildPath(idpMapperCreateList))
if err = a.checkError(err, rsp); err != nil {
return nil, errors.Wrap(err, "unable to get idp mappers")
}
return res, nil
}