svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.downloader / org.gvsig.downloader.swing / org.gvsig.downloader.swing.scribejava / src / main / java / org / gvsig / downloader / swing / scribejava / keycloak / KeycloakApi2.java @ 47828
History | View | Annotate | Download (3.25 KB)
1 |
package org.gvsig.downloader.swing.scribejava.keycloak; |
---|---|
2 |
|
3 |
import com.github.scribejava.apis.openid.OpenIdJsonTokenExtractor; |
4 |
import com.github.scribejava.core.builder.api.DefaultApi20; |
5 |
import com.github.scribejava.core.extractors.TokenExtractor; |
6 |
import com.github.scribejava.core.model.OAuth2AccessToken; |
7 |
|
8 |
import java.util.concurrent.ConcurrentHashMap; |
9 |
import java.util.concurrent.ConcurrentMap; |
10 |
import org.apache.commons.lang3.StringUtils; |
11 |
|
12 |
/*
|
13 |
* Based on portions of code from ScribeJava (https://github.com/scribejava/scribejava)
|
14 |
* in module scribejava-apis.
|
15 |
* https://github.com/scribejava/scribejava/blob/master/scribejava-apis/src/main/java/com/github/scribejava/apis/KeycloakApi.java
|
16 |
*/
|
17 |
public class KeycloakApi2 extends DefaultApi20 { |
18 |
|
19 |
private static final ConcurrentMap<String, KeycloakApi2> INSTANCES = new ConcurrentHashMap<>(); |
20 |
|
21 |
private final String baseUrlWithRealm; |
22 |
|
23 |
protected KeycloakApi2(String baseUrlWithRealm) { |
24 |
this.baseUrlWithRealm = baseUrlWithRealm;
|
25 |
} |
26 |
|
27 |
public static KeycloakApi2 instance() { |
28 |
return instance("http://localhost:8080/", "master"); |
29 |
} |
30 |
|
31 |
public static KeycloakApi2 instance(String baseUrl, String realm) { |
32 |
final String defaultBaseUrlWithRealm = composeBaseUrlWithRealm(baseUrl, realm); |
33 |
|
34 |
//java8: switch to ConcurrentMap::computeIfAbsent
|
35 |
KeycloakApi2 api = INSTANCES.get(defaultBaseUrlWithRealm); |
36 |
if (api == null) { |
37 |
api = new KeycloakApi2(defaultBaseUrlWithRealm);
|
38 |
final KeycloakApi2 alreadyCreatedApi = INSTANCES.putIfAbsent(defaultBaseUrlWithRealm, api);
|
39 |
if (alreadyCreatedApi != null) { |
40 |
return alreadyCreatedApi;
|
41 |
} |
42 |
} |
43 |
return api;
|
44 |
} |
45 |
|
46 |
protected static String composeBaseUrlWithRealm(String baseUrl, String realm) { |
47 |
if( !StringUtils.endsWith(baseUrl, "/") ) { |
48 |
baseUrl += "/";
|
49 |
} |
50 |
if( StringUtils.endsWith(baseUrl, "/realms/") ) { |
51 |
baseUrl += realm; |
52 |
} else {
|
53 |
baseUrl += "auth/realms/" + realm;
|
54 |
} |
55 |
// return baseUrl + (baseUrl.endsWith("/") ? "" : "/") + "auth/realms/" + realm;
|
56 |
return baseUrl;
|
57 |
} |
58 |
|
59 |
@Override
|
60 |
public String getAccessTokenEndpoint() { |
61 |
return baseUrlWithRealm + "/protocol/openid-connect/token"; |
62 |
} |
63 |
|
64 |
@Override
|
65 |
protected String getAuthorizationBaseUrl() { |
66 |
return baseUrlWithRealm + "/protocol/openid-connect/auth"; |
67 |
} |
68 |
|
69 |
@Override
|
70 |
public TokenExtractor<OAuth2AccessToken> getAccessTokenExtractor() {
|
71 |
return OpenIdJsonTokenExtractor.instance();
|
72 |
} |
73 |
|
74 |
@Override
|
75 |
public String getRevokeTokenEndpoint() { |
76 |
throw new RuntimeException("Not implemented yet"); |
77 |
} |
78 |
|
79 |
public String getUserInfoEndpoint() { |
80 |
return baseUrlWithRealm + "/protocol/openid-connect/userinfo"; |
81 |
} |
82 |
|
83 |
public String getLogoutEndpoint(String clientid, String redirect_uri) { |
84 |
// String redirect_uri_name = "redirect_uri";
|
85 |
String redirect_uri_name = "post_logout_redirect_uri"; |
86 |
String logoutUrl = String.format( |
87 |
"%s/protocol/openid-connect/logout?%s=%s&client_id=%s",
|
88 |
this.baseUrlWithRealm,
|
89 |
redirect_uri_name, |
90 |
redirect_uri, |
91 |
clientid |
92 |
); |
93 |
return logoutUrl;
|
94 |
} |
95 |
} |