diff --git a/client_initial_access.go b/client_initial_access.go index cf172a0..39fa52d 100644 --- a/client_initial_access.go +++ b/client_initial_access.go @@ -1 +1,29 @@ package keycloak + +import ( + "gopkg.in/h2non/gentleman.v2/plugins/body" + "gopkg.in/h2non/gentleman.v2/plugins/url" +) + +const ( + clientInitialAccessPath = "/auth/admin/realms/:realm/clients-initial-access" +) + +// CreateClientInitialAccess creates a new initial access token. +func (c *Client) CreateClientInitialAccess(realmName string, access ClientInitialAccessCreatePresentation) (ClientInitialAccessPresentation, error) { + var resp = ClientInitialAccessPresentation{} + var err = c.post(url.Path(clientInitialAccessPath), url.Param("realm", realmName), body.JSON(access)) + return respasf, err +} + +// GetClientInitialAccess returns a list of clients initial access. +func (c *Client) GetClientInitialAccess(realmName string) ([]ClientInitialAccessPresentation, error) { + var resp = []ClientInitialAccessPresentation{} + var err = c.get(&resp, url.Path(clientInitialAccessPath), url.Param("realm", realmName)) + return resp, err +} + +// DeleteClientInitialAccess deletes the client initial access. +func (c *Client) DeleteClientInitialAccess(realmName, accessID string) error { + return c.delete(url.Path(clientInitialAccessPath+"/:id"), url.Param("realm", realmName), url.Param("id", accessID)) +} diff --git a/client_registration_policy.go b/client_registration_policy.go index cf172a0..a1b6d39 100644 --- a/client_registration_policy.go +++ b/client_registration_policy.go @@ -1 +1,14 @@ package keycloak + +import "gopkg.in/h2non/gentleman.v2/plugins/url" + +const ( + clientRegistrationPolicyPath = "/auth/admin/realms/:realm/client-registration-policy/providers" +) + +// GetClientRegistrationPolicy is the base path to retrieve providers with the configProperties properly filled. +func (c *Client) GetClientRegistrationPolicy(realmName, configID string) ([]ComponentTypeRepresentation, error) { + var resp = []ComponentTypeRepresentation{} + var err = c.get(&resp, url.Path(clientRegistrationPolicyPath), url.Param("realm", realmName)) + return resp, err +} diff --git a/client_role_mappings.go b/client_role_mappings.go index cf172a0..0aeb79e 100644 --- a/client_role_mappings.go +++ b/client_role_mappings.go @@ -1 +1,27 @@ package keycloak + +import ( + "gopkg.in/h2non/gentleman.v2/plugins/body" + "gopkg.in/h2non/gentleman.v2/plugins/url" +) + +const ( + clientRoleMappingPath = "/auth/admin/realms/:realm/groups/:id/role-mappings/clients/:client" +) + +// CreateClientsRoleMapping add client-level roles to the user role mapping. +func (c *Client) CreateClientsRoleMapping(realmName, groupID, clientID string, roles []RoleRepresentation) error { + return c.post(url.Path(clientRoleMappingPath), url.Param("realm", realmName), url.Param("id", groupID), url.Param("client", clientID), body.JSON(roles)) +} + +// GetClientsRoleMapping gets client-level role mappings for the user, and the app. +func (c *Client) GetClientsRoleMapping(realmName, groupID, clientID string) ([]RoleRepresentation, error) { + var resp = []RoleRepresentation{} + var err = c.get(&resp, url.Path(clientRoleMappingPath), url.Param("realm", realmName), url.Param("id", groupID), url.Param("client", clientID)) + return resp, err +} + +// DeleteClientsRoleMapping deletes client-level roles from user role mapping. +func (c *Client) DeleteClientsRoleMapping(realmName, groupID, clientID string) error { + return c.delete(url.Path(clientRoleMappingPath), url.Param("realm", realmName), url.Param("id", groupID), url.Param("client", clientID)) +} diff --git a/keycloak_client.go b/keycloak_client.go index 94224dd..644880f 100644 --- a/keycloak_client.go +++ b/keycloak_client.go @@ -2,7 +2,6 @@ package keycloak import ( "context" - "encoding/json" "fmt" "net/http" "net/url" @@ -128,6 +127,7 @@ func (c *Client) verifyToken() error { // get is a HTTP get method. func (c *Client) get(data interface{}, plugins ...plugin.Plugin) error { var req = c.httpClient.Get() + req = applyPlugins(req, c.accessToken, plugins...) var resp *gentleman.Response @@ -151,7 +151,15 @@ func (c *Client) get(data interface{}, plugins ...plugin.Plugin) error { case resp.StatusCode >= 400: return fmt.Errorf("invalid status code: '%v': %v", resp.RawResponse.Status, string(resp.Bytes())) case resp.StatusCode >= 200: - return json.Unmarshal(resp.Bytes(), data) + switch resp.Header.Get("Content-Type") { + case "application/json": + return resp.JSON(data) + case "application/octet-stream": + data = resp.Bytes() + return nil + default: + return fmt.Errorf("unkown http content-type: %v", resp.Header.Get("Content-Type")) + } default: return fmt.Errorf("unknown response status code: %v", resp.StatusCode) } @@ -161,7 +169,6 @@ func (c *Client) get(data interface{}, plugins ...plugin.Plugin) error { func (c *Client) post(plugins ...plugin.Plugin) error { var req = c.httpClient.Post() req = applyPlugins(req, c.accessToken, plugins...) - var resp *gentleman.Response { var err error diff --git a/users.go b/users.go index 3738cf6..36143f6 100644 --- a/users.go +++ b/users.go @@ -29,8 +29,8 @@ func (c *Client) GetUsers(realmName string, paramKV ...string) ([]UserRepresenta } // CreateUser creates the user from its UserRepresentation. The username must be unique. -func (c *Client) CreateUser(realm string, user UserRepresentation) error { - return c.post(url.Path(userPath), url.Param("realm", realm), body.JSON(user)) +func (c *Client) CreateUser(realmName string, user UserRepresentation) error { + return c.post(url.Path(userPath), url.Param("realm", realmName), body.JSON(user)) } // CountUsers returns the number of users in the realm.