@@ -17,10 +17,10 @@ type User struct {
1717}
1818
1919// CreateUser creates a new user in Keycloak
20- func (kc * KeycloakClient ) CreateUser (username , email , password string ) error {
20+ func (kc * KeycloakClient ) CreateUser (realm , username , email , password string ) error {
2121 userDetails := struct {
22- Username string `json:"username"`
23- Email string `json:"email"`
22+ Username string `json:"username"`
23+ Email string `json:"email"`
2424 Credentials []struct {
2525 Type string `json:"type"`
2626 Value string `json:"value"`
@@ -35,13 +35,15 @@ func (kc *KeycloakClient) CreateUser(username, email, password string) error {
3535 Temporary bool `json:"temporary"`
3636 }{
3737 {
38- Type : "password" ,
39- Value : password ,
38+ Type : "password" ,
39+ Value : password ,
40+ Temporary : false , // Set to true if you want the user to change password on first login
4041 },
4142 },
4243 }
4344
44- url := fmt .Sprintf ("%s/admin/realms/%s/users" , kc .BaseURL , kc .RealmToEdit )
45+ // Use the provided realm in the URL instead of the default realm
46+ url := fmt .Sprintf ("%s/admin/realms/%s/users" , kc .BaseURL , realm )
4547
4648 // Encode the user details as JSON for the request body
4749 jsonBody , err := json .Marshal (userDetails )
@@ -67,15 +69,17 @@ func (kc *KeycloakClient) CreateUser(username, email, password string) error {
6769 // Check for successful status code, typically 201 for creation
6870 if res .StatusCode != http .StatusCreated {
6971 errorResponse , _ := ioutil .ReadAll (res .Body )
70- return fmt .Errorf ("failed to create user, received status code: %d, error message: %s" , res .StatusCode , errorResponse )
72+ return fmt .Errorf ("failed to create user in realm %s , received status code: %d, error message: %s" , realm , res .StatusCode , string ( errorResponse ) )
7173 }
7274
7375 return nil
7476}
7577
76- // ListUsers lists all users in Keycloak
77- func (kc * KeycloakClient ) ListUsers () ([]User , error ) {
78- url := fmt .Sprintf ("%s/admin/realms/%s/users" , kc .BaseURL , kc .RealmToEdit )
78+
79+ func (kc * KeycloakClient ) ListUsers (realm string ) ([]User , error ) {
80+ // Use the provided realm in the URL instead of the default realm
81+ url := fmt .Sprintf ("%s/admin/realms/%s/users" , kc .BaseURL , realm )
82+
7983 req , err := http .NewRequest ("GET" , url , nil )
8084 if err != nil {
8185 return nil , err
@@ -97,8 +101,9 @@ func (kc *KeycloakClient) ListUsers() ([]User, error) {
97101 return users , nil
98102}
99103
100- func (kc * KeycloakClient ) DeleteUser (userID string ) error {
101- url := fmt .Sprintf ("%s/admin/realms/%s/users/%s" , kc .BaseURL , kc .RealmToEdit , userID )
104+
105+ func (kc * KeycloakClient ) DeleteUser (realm , userID string ) error {
106+ url := fmt .Sprintf ("%s/admin/realms/%s/users/%s" , kc .BaseURL , realm , userID )
102107
103108 req , err := http .NewRequest ("DELETE" , url , nil )
104109 if err != nil {
@@ -112,19 +117,19 @@ func (kc *KeycloakClient) DeleteUser(userID string) error {
112117 }
113118 defer res .Body .Close ()
114119
115- // Check for successful status code, typically 204 for successful deletion
116120 if res .StatusCode != http .StatusNoContent {
117121 errorResponse , _ := ioutil .ReadAll (res .Body )
118- return fmt .Errorf ("failed to delete user, received status code: %d, error message: %s" , res .StatusCode , errorResponse )
122+ return fmt .Errorf ("failed to delete user in realm %s , received status code: %d, error message: %s" , realm , res .StatusCode , string ( errorResponse ) )
119123 }
120124
121125 return nil
122126}
123127
124128
129+
125130// GetUserIDByUsername retrieves the userID based on the provided username
126- func (kc * KeycloakClient ) GetUserIDByUsername (username string ) (string , error ) {
127- url := fmt .Sprintf ("%s/admin/realms/%s/users" , kc .BaseURL , kc . RealmToEdit )
131+ func (kc * KeycloakClient ) GetUserIDByUsername (realm , username string ) (string , error ) {
132+ url := fmt .Sprintf ("%s/admin/realms/%s/users" , kc .BaseURL , realm )
128133
129134 req , err := http .NewRequest ("GET" , url , nil )
130135 if err != nil {
@@ -140,23 +145,21 @@ func (kc *KeycloakClient) GetUserIDByUsername(username string) (string, error) {
140145
141146 if res .StatusCode != http .StatusOK {
142147 errorResponse , _ := ioutil .ReadAll (res .Body )
143- return "" , fmt .Errorf ("failed to retrieve users, received status code: %d, error message: %s" , res .StatusCode , errorResponse )
148+ return "" , fmt .Errorf ("failed to retrieve users from realm %s , received status code: %d, error message: %s" , realm , res .StatusCode , string ( errorResponse ) )
144149 }
145150
146- // Read the response body and parse it as an array of User objects
147151 var users []User
148152 err = json .NewDecoder (res .Body ).Decode (& users )
149153 if err != nil {
150154 return "" , err
151155 }
152156
153- // Search for the user with the matching username
154157 for _ , user := range users {
155158 if user .Username == username {
156159 return user .ID , nil
157160 }
158161 }
159162
160- // If no matching user is found, return an error
161- return "" , fmt .Errorf ("user with username %s not found in %s realm" , username , kc .RealmToEdit )
163+ return "" , fmt .Errorf ("user with username %s not found in realm %s" , username , realm )
162164}
165+
0 commit comments