2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.oauthprovider.providers;
24 import com.fasterxml.jackson.core.JsonProcessingException;
25 import com.fasterxml.jackson.databind.JsonMappingException;
26 import java.util.HashMap;
27 import java.util.List;
29 import java.util.stream.Collectors;
30 import org.onap.ccsdk.features.sdnr.wt.oauthprovider.data.KeycloakUserTokenPayload;
31 import org.onap.ccsdk.features.sdnr.wt.oauthprovider.data.OAuthProviderConfig;
32 import org.onap.ccsdk.features.sdnr.wt.oauthprovider.data.UserTokenPayload;
34 public class KeycloakProviderService extends AuthService {
36 public static final String ID = "keycloak";
37 private Map<String, String> additionalTokenVerifierParams;
39 public KeycloakProviderService(OAuthProviderConfig config, String redirectUri, TokenCreator tokenCreator) {
40 super(config, redirectUri, tokenCreator);
41 this.additionalTokenVerifierParams = new HashMap<>();
42 this.additionalTokenVerifierParams.put("grant_type", "authorization_code");
46 protected String getTokenVerifierUri() {
47 return "/auth/realms/onap/protocol/openid-connect/token";
51 protected String getLoginUrl(String callbackUrl) {
53 "%s/auth/realms/onap/protocol/openid-connect/auth?client_id=%s&response_type=code&scope=%s&redirect_uri=%s",
54 this.config.getHost(), urlEncode(this.config.getClientId()), this.config.getScope(),
55 urlEncode(callbackUrl));
60 private List<String> mapRoles(List<String> data) {
62 List<String> filteredRoles =
63 data.stream().filter(role -> !role.equals("uma_authorization") && !role.equals("offline_access"))
64 .map(r -> r).collect(Collectors.toList());
69 protected ResponseType getResponseType() {
70 return ResponseType.CODE;
74 protected Map<String, String> getAdditionalTokenVerifierParams() {
75 return this.additionalTokenVerifierParams;
80 protected boolean doSeperateRolesRequest() {
85 protected UserTokenPayload mapAccessToken(String spayload) throws JsonMappingException, JsonProcessingException {
86 KeycloakUserTokenPayload payload = mapper.readValue(spayload, KeycloakUserTokenPayload.class);
87 UserTokenPayload data = new UserTokenPayload();
88 data.setExp(payload.getExp() * 1000L);
89 data.setFamilyName(payload.getFamilyName());
90 data.setGivenName(payload.getGivenName());
91 data.setPreferredUsername(payload.getPreferredUsername());
92 data.setRoles(this.mapRoles(payload.getRealmAccess().getRoles()));