Skip to content

Commit 4e09863

Browse files
committed
adapting tests to use keycloak
1 parent 22960a4 commit 4e09863

File tree

75 files changed

+506
-591
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+506
-591
lines changed

INSTALL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ on Windows.
3131
1. Sign in to Okta [API credentials](https://developer.okta.com/signup/)
3232
2. Click on **_Applications_** and from there **_Add Application_**.
3333
3. Select type `Web`.
34-
4. Fill in the `Login redirect URI` as follows: `https://{your_base_url}/go/plugin/cd.go.authorization.okta/authenticate`
35-
5. Click **_Save_** and afterwards change the `Initiate login URI` to: `https://{your_base_url}/go/plugin/cd.go.authorization.okta/login`
34+
4. Fill in the `Login redirect URI` as follows: `https://{your_base_url}/go/plugin/cd.go.authorization.keycloak/authenticate`
35+
5. Click **_Save_** and afterwards change the `Initiate login URI` to: `https://{your_base_url}/go/plugin/cd.go.authorization.keycloak/login`
3636

3737
### Create Authorization Configuration
3838

src/main/java/cd/go/authorization/keycloak/CallbackURL.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package cd.go.authorization.keycloak;
1818

19-
import cd.go.authorization.okta.utils.Util;
19+
import cd.go.authorization.keycloak.utils.Util;
2020

2121
public class CallbackURL {
2222
private static final CallbackURL CALLBACK_URL = new CallbackURL();

src/main/java/cd/go/authorization/keycloak/KeycloakApiClient.java

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,27 @@
1616

1717
package cd.go.authorization.keycloak;
1818

19-
import cd.go.authorization.okta.models.OktaConfiguration;
20-
import cd.go.authorization.okta.models.TokenInfo;
19+
import cd.go.authorization.keycloak.models.KeycloakConfiguration;
20+
import cd.go.authorization.keycloak.models.TokenInfo;
2121
import okhttp3.*;
2222

2323
import java.io.IOException;
2424
import java.util.Map;
2525
import java.util.UUID;
2626
import java.util.concurrent.TimeUnit;
2727

28-
import static cd.go.authorization.okta.OktaPlugin.LOG;
29-
import static cd.go.authorization.okta.utils.Util.isBlank;
30-
import static cd.go.authorization.okta.utils.Util.isNotBlank;
28+
import static cd.go.authorization.keycloak.KeycloakPlugin.LOG;
29+
import static cd.go.authorization.keycloak.utils.Util.isBlank;
30+
import static cd.go.authorization.keycloak.utils.Util.isNotBlank;
3131
import static java.text.MessageFormat.format;
3232

3333
public class KeycloakApiClient {
3434
private static final String API_ERROR_MSG = "Api call to `{0}` failed with error: `{1}`";
35-
private final OktaConfiguration oktaConfiguration;
35+
private final KeycloakConfiguration keycloakConfiguration;
3636
private final OkHttpClient httpClient;
3737

38-
public KeycloakApiClient(OktaConfiguration oktaConfiguration) {
39-
this(oktaConfiguration,
38+
public KeycloakApiClient(KeycloakConfiguration keycloakConfiguration) {
39+
this(keycloakConfiguration,
4040
new OkHttpClient.Builder()
4141
.connectTimeout(10, TimeUnit.SECONDS)
4242
.writeTimeout(10, TimeUnit.SECONDS)
@@ -45,8 +45,8 @@ public KeycloakApiClient(OktaConfiguration oktaConfiguration) {
4545
);
4646
}
4747

48-
public KeycloakApiClient(OktaConfiguration oktaConfiguration, OkHttpClient httpClient) {
49-
this.oktaConfiguration = oktaConfiguration;
48+
public KeycloakApiClient(KeycloakConfiguration keycloakConfiguration, OkHttpClient httpClient) {
49+
this.keycloakConfiguration = keycloakConfiguration;
5050
this.httpClient = httpClient;
5151
}
5252

@@ -55,13 +55,17 @@ public void verifyConnection() throws Exception {
5555
}
5656

5757
public String authorizationServerUrl(String callbackUrl) throws Exception {
58-
LOG.debug("[OktaApiClient] Generating Okta oauth url.");
58+
LOG.debug("[KeycloakApiClient] Generating Keycloak oauth url.");
5959

60-
return HttpUrl.parse(oktaConfiguration.oktaEndpoint())
60+
return HttpUrl.parse(keycloakConfiguration.keycloakEndpoint())
6161
.newBuilder()
62-
.addPathSegments("v1")
63-
.addPathSegments("authorize")
64-
.addQueryParameter("client_id", oktaConfiguration.clientId())
62+
.addPathSegments("auth")
63+
.addPathSegments("realms")
64+
.addPathSegments("master")
65+
.addPathSegments("protocol")
66+
.addPathSegments("openid-connect")
67+
.addPathSegments("auth")
68+
.addQueryParameter("client_id", keycloakConfiguration.clientId())
6569
.addQueryParameter("redirect_uri", callbackUrl)
6670
.addQueryParameter("response_type", "code")
6771
.addQueryParameter("scope", "openid profile email groups")
@@ -73,20 +77,24 @@ public String authorizationServerUrl(String callbackUrl) throws Exception {
7377
public TokenInfo fetchAccessToken(Map<String, String> params) throws Exception {
7478
final String code = params.get("code");
7579
if (isBlank(code)) {
76-
throw new RuntimeException("[OktaApiClient] Authorization code must not be null.");
80+
throw new RuntimeException("[KeycloakApiClient] Authorization code must not be null.");
7781
}
7882

79-
LOG.debug("[OktaApiClient] Fetching access token using authorization code.");
83+
LOG.debug("[KeycloakApiClient] Fetching access token using authorization code.");
8084

81-
final String accessTokenUrl = HttpUrl.parse(oktaConfiguration.oktaEndpoint())
85+
final String accessTokenUrl = HttpUrl.parse(keycloakConfiguration.keycloakEndpoint())
8286
.newBuilder()
83-
.addPathSegments("v1")
87+
.addPathSegments("auth")
88+
.addPathSegments("realms")
89+
.addPathSegments("master")
90+
.addPathSegments("protocol")
91+
.addPathSegments("openid-connect")
8492
.addPathSegments("token")
8593
.build().toString();
8694

8795
final FormBody formBody = new FormBody.Builder()
88-
.add("client_id", oktaConfiguration.clientId())
89-
.add("client_secret", oktaConfiguration.clientSecret())
96+
.add("client_id", keycloakConfiguration.clientId())
97+
.add("client_secret", keycloakConfiguration.clientSecret())
9098
.add("code", code)
9199
.add("grant_type", "authorization_code")
92100
.add("redirect_uri", CallbackURL.instance().getCallbackURL()).build();
@@ -100,14 +108,18 @@ public TokenInfo fetchAccessToken(Map<String, String> params) throws Exception {
100108
return executeRequest(request, response -> TokenInfo.fromJSON(response.body().string()));
101109
}
102110

103-
public OktaUser userProfile(TokenInfo tokenInfo) throws Exception {
111+
public KeycloakUser userProfile(TokenInfo tokenInfo) throws Exception {
104112
validateTokenInfo(tokenInfo);
105113

106-
LOG.debug("[OktaApiClient] Fetching user profile using access token.");
114+
LOG.debug("[KeycloakApiClient] Fetching user profile using access token.");
107115

108-
final String userProfileUrl = HttpUrl.parse(oktaConfiguration.oktaEndpoint())
116+
final String userProfileUrl = HttpUrl.parse(keycloakConfiguration.keycloakEndpoint())
109117
.newBuilder()
110-
.addPathSegments("v1")
118+
.addPathSegments("auth")
119+
.addPathSegments("realms")
120+
.addPathSegments("master")
121+
.addPathSegments("protocol")
122+
.addPathSegments("openid-connect")
111123
.addPathSegments("userinfo")
112124
.toString();
113125

@@ -119,7 +131,7 @@ public OktaUser userProfile(TokenInfo tokenInfo) throws Exception {
119131
.post(formBody)
120132
.build();
121133

122-
return executeRequest(request, response -> OktaUser.fromJSON(response.body().string()));
134+
return executeRequest(request, response -> KeycloakUser.fromJSON(response.body().string()));
123135
}
124136

125137
private interface Callback<T> {
@@ -140,7 +152,7 @@ private <T> T executeRequest(Request request, Callback<T> callback) throws IOExc
140152

141153
private void validateTokenInfo(TokenInfo tokenInfo) {
142154
if (tokenInfo == null) {
143-
throw new RuntimeException("[OktaApiClient] TokenInfo must not be null.");
155+
throw new RuntimeException("[KeycloakApiClient] TokenInfo must not be null.");
144156
}
145157
}
146158
}

src/main/java/cd/go/authorization/keycloak/KeycloakAuthorizer.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616

1717
package cd.go.authorization.keycloak;
1818

19-
import cd.go.authorization.okta.models.AuthConfig;
20-
import cd.go.authorization.okta.models.Role;
19+
import cd.go.authorization.keycloak.models.AuthConfig;
20+
import cd.go.authorization.keycloak.models.Role;
2121

2222
import java.io.IOException;
2323
import java.util.ArrayList;
2424
import java.util.List;
2525

26-
import static cd.go.authorization.okta.OktaPlugin.LOG;
26+
import static cd.go.authorization.keycloak.KeycloakPlugin.LOG;
2727
import static java.text.MessageFormat.format;
2828

2929
public class KeycloakAuthorizer {
@@ -37,8 +37,8 @@ public KeycloakAuthorizer(MembershipChecker membershipChecker) {
3737
this.membershipChecker = membershipChecker;
3838
}
3939

40-
public List<String> authorize(OktaUser loggedInUser, AuthConfig authConfig, List<Role> roles) throws IOException {
41-
final OktaUser user = loggedInUser;
40+
public List<String> authorize(KeycloakUser loggedInUser, AuthConfig authConfig, List<Role> roles) throws IOException {
41+
final KeycloakUser user = loggedInUser;
4242
final List<String> assignedRoles = new ArrayList<>();
4343

4444
if (roles.isEmpty()) {
@@ -58,7 +58,6 @@ public List<String> authorize(OktaUser loggedInUser, AuthConfig authConfig, List
5858
if (membershipChecker.isAMemberOfAtLeastOneGroup(loggedInUser, authConfig, role.roleConfiguration().groups())) {
5959
LOG.debug(format("[Authorize] Assigning role `{0}` to user `{1}`. As user is a member of at least one group.", role.name(), user.getEmail()));
6060
assignedRoles.add(role.name());
61-
continue;
6261
}
6362
}
6463

src/main/java/cd/go/authorization/keycloak/KeycloakPlugin.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717
package cd.go.authorization.keycloak;
1818

19-
import cd.go.authorization.okta.exceptions.NoSuchRequestHandlerException;
20-
import cd.go.authorization.okta.executors.*;
21-
import cd.go.authorization.okta.requests.*;
19+
import cd.go.authorization.keycloak.exceptions.NoSuchRequestHandlerException;
20+
import cd.go.authorization.keycloak.executors.*;
21+
import cd.go.authorization.keycloak.requests.*;
2222
import com.thoughtworks.go.plugin.api.GoApplicationAccessor;
2323
import com.thoughtworks.go.plugin.api.GoPlugin;
2424
import com.thoughtworks.go.plugin.api.GoPluginIdentifier;
@@ -28,11 +28,11 @@
2828
import com.thoughtworks.go.plugin.api.request.GoPluginApiRequest;
2929
import com.thoughtworks.go.plugin.api.response.GoPluginApiResponse;
3030

31-
import static cd.go.authorization.okta.Constants.PLUGIN_IDENTIFIER;
31+
import static cd.go.authorization.keycloak.Constants.PLUGIN_IDENTIFIER;
3232

3333
@Extension
3434
public class KeycloakPlugin implements GoPlugin {
35-
public static final Logger LOG = Logger.getLoggerFor(OktaPlugin.class);
35+
public static final Logger LOG = Logger.getLoggerFor(KeycloakPlugin.class);
3636

3737
private GoApplicationAccessor accessor;
3838

src/main/java/cd/go/authorization/keycloak/KeycloakUser.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,13 @@
1616

1717
package cd.go.authorization.keycloak;
1818

19-
import cd.go.authorization.okta.utils.Util;
2019
import com.google.gson.annotations.Expose;
2120
import com.google.gson.annotations.SerializedName;
2221

2322
import java.util.List;
2423

25-
import static cd.go.authorization.okta.OktaPlugin.LOG;
26-
import static cd.go.authorization.okta.utils.Util.GSON;
24+
import static cd.go.authorization.keycloak.KeycloakPlugin.LOG;
25+
import static cd.go.authorization.keycloak.utils.Util.GSON;
2726

2827
public class KeycloakUser {
2928
@Expose
@@ -126,7 +125,7 @@ public String toJSON() {
126125
return GSON.toJson(this);
127126
}
128127

129-
public static OktaUser fromJSON(String json) {
130-
return GSON.fromJson(json, OktaUser.class);
128+
public static KeycloakUser fromJSON(String json) {
129+
return GSON.fromJson(json, KeycloakUser.class);
131130
}
132131
}

src/main/java/cd/go/authorization/keycloak/MembershipChecker.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@
1616

1717
package cd.go.authorization.keycloak;
1818

19-
import cd.go.authorization.okta.models.AuthConfig;
19+
import cd.go.authorization.keycloak.models.AuthConfig;
2020

2121
import java.io.IOException;
2222
import java.util.List;
2323

24-
import static cd.go.authorization.okta.OktaPlugin.LOG;
24+
import static cd.go.authorization.keycloak.KeycloakPlugin.LOG;
2525
import static java.text.MessageFormat.format;
2626

2727
public class MembershipChecker {
2828

29-
public boolean isAMemberOfAtLeastOneGroup(OktaUser loggedInUser, AuthConfig authConfig, List<String> groupsAllowed) throws IOException {
29+
public boolean isAMemberOfAtLeastOneGroup(KeycloakUser loggedInUser, AuthConfig authConfig, List<String> groupsAllowed) throws IOException {
3030
if (groupsAllowed.isEmpty()) {
3131
LOG.info("[MembershipChecker] No groups provided.");
3232
return false;
@@ -35,7 +35,7 @@ public boolean isAMemberOfAtLeastOneGroup(OktaUser loggedInUser, AuthConfig auth
3535
return checkMembershipUsingUsersAccessToken(loggedInUser, groupsAllowed);
3636
}
3737

38-
private boolean checkMembershipUsingUsersAccessToken(OktaUser loggedInUser, List<String> groupsAllowed) throws IOException {
38+
private boolean checkMembershipUsingUsersAccessToken(KeycloakUser loggedInUser, List<String> groupsAllowed) throws IOException {
3939
final List<String> myGroups = loggedInUser.groups();
4040

4141
for (String groupName : myGroups) {

src/main/java/cd/go/authorization/keycloak/annotation/FieldMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package cd.go.authorization.okta.annotation;
17+
package cd.go.authorization.keycloak.annotation;
1818

1919
import com.google.gson.annotations.Expose;
2020
import com.google.gson.annotations.SerializedName;

src/main/java/cd/go/authorization/keycloak/annotation/FieldType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package cd.go.authorization.okta.annotation;
17+
package cd.go.authorization.keycloak.annotation;
1818

1919
public enum FieldType {
2020
STRING {

src/main/java/cd/go/authorization/keycloak/annotation/Metadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package cd.go.authorization.okta.annotation;
17+
package cd.go.authorization.keycloak.annotation;
1818

1919
public interface Metadata {
2020
boolean isRequired();

0 commit comments

Comments
 (0)