Skip to content

Commit b34f438

Browse files
committed
feat: extract elements from MVP sample
Refs: #4, #5
1 parent 8565f24 commit b34f438

Some content is hidden

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

43 files changed

+2540
-94
lines changed

examples/relying-party-spring-boot/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@
4646
<scope>runtime</scope>
4747
</dependency>
4848

49+
<!-- SPID/CIE OIDC StarterKit -->
50+
<dependency>
51+
<groupId>it.spid.cie.oidc</groupId>
52+
<artifactId>it.spid.cie.oidc.starter.kit</artifactId>
53+
<version>${project.parent.version}</version>
54+
</dependency>
55+
4956
<dependency>
5057
<groupId>org.springframework.boot</groupId>
5158
<artifactId>spring-boot-starter-test</artifactId>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package it.spid.cie.oidc.spring.boot.relying.party;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.boot.CommandLineRunner;
5+
import org.springframework.boot.SpringApplication;
6+
import org.springframework.boot.autoconfigure.SpringBootApplication;
7+
8+
import it.spid.cie.oidc.spring.boot.relying.party.config.OidcConfig;
9+
10+
@SpringBootApplication
11+
public class RelyingPartySampleApplication implements CommandLineRunner {
12+
13+
@Autowired
14+
private OidcConfig oidcConfig;
15+
16+
public static void main(String[] args) {
17+
SpringApplication.run(RelyingPartySampleApplication.class, args);
18+
}
19+
20+
@Override
21+
public void run(String... args) throws Exception {
22+
System.out.println("Configuration:\n" + oidcConfig.toJSONString(2));
23+
}
24+
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package it.spid.cie.oidc.spring.boot.relying.party;
2+
3+
import javax.annotation.PostConstruct;
4+
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.stereotype.Component;
9+
10+
import it.spid.cie.oidc.config.RelyingPartyOptions;
11+
import it.spid.cie.oidc.exception.OIDCException;
12+
import it.spid.cie.oidc.handler.RelyingPartyHandler;
13+
import it.spid.cie.oidc.schemas.WellKnownData;
14+
import it.spid.cie.oidc.spring.boot.relying.party.config.OidcConfig;
15+
import it.spid.cie.oidc.spring.boot.relying.party.persistence.H2PersistenceImpl;
16+
17+
@Component
18+
public class RelyingPartyWrapper {
19+
20+
public WellKnownData getWellKnownData(String requestURL, boolean jsonMode)
21+
throws OIDCException {
22+
23+
return relyingPartyHandler.getWellKnownData(requestURL, jsonMode);
24+
}
25+
26+
@PostConstruct
27+
private void postConstruct() throws OIDCException {
28+
RelyingPartyOptions options = new RelyingPartyOptions()
29+
.setDefaultTrustAnchor(oidcConfig.getDefaultTrustAnchor())
30+
.setSPIDProviders(oidcConfig.getIdentityProviders())
31+
.setTrustAnchors(oidcConfig.getTrustAnchors())
32+
.setApplicationName(oidcConfig.getRelyingParty().getApplicationName())
33+
.setClientId(oidcConfig.getRelyingParty().getClientId())
34+
.setRedirectUris(oidcConfig.getRelyingParty().getRedirectUris())
35+
.setContacts(oidcConfig.getRelyingParty().getContacts())
36+
.setJWK(oidcConfig.getRelyingParty().getJwk())
37+
.setTrustMarks(oidcConfig.getRelyingParty().getTrustMarks());
38+
39+
relyingPartyHandler = new RelyingPartyHandler(options, persistenceImpl);
40+
}
41+
42+
private static Logger logger = LoggerFactory.getLogger(RelyingPartyWrapper.class);
43+
44+
@Autowired
45+
private OidcConfig oidcConfig;
46+
47+
@Autowired
48+
private H2PersistenceImpl persistenceImpl;
49+
50+
private RelyingPartyHandler relyingPartyHandler;
51+
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package it.spid.cie.oidc.spring.boot.relying.party.config;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
5+
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
6+
7+
@Configuration
8+
public class MvcConfig implements WebMvcConfigurer {
9+
10+
public void addViewControllers(ViewControllerRegistry registry) {
11+
registry.addViewController("/home").setViewName("home");
12+
registry.addViewController("/").setViewName("home");
13+
registry.addViewController("/oidc/rp/landing").setViewName("landing");
14+
registry
15+
.addViewController("/oidc/rp/.well-known/openid-federation")
16+
.setViewName("well-known");
17+
registry.addViewController("/hello").setViewName("hello");
18+
registry
19+
.addViewController("/oidc/rp/echo_attributes")
20+
.setViewName("echo_attributes");
21+
}
22+
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
package it.spid.cie.oidc.spring.boot.relying.party.config;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Set;
10+
11+
import org.json.JSONObject;
12+
import org.springframework.boot.context.properties.ConfigurationProperties;
13+
import org.springframework.context.annotation.Configuration;
14+
15+
@Configuration
16+
@ConfigurationProperties(prefix = "oidc")
17+
public class OidcConfig {
18+
19+
private String defaultTrustAnchor;
20+
private List<String> trustAnchors = new ArrayList<>();
21+
private Map<String, String> identityProviders = new HashMap<>();
22+
private RelyingParty relyingParty = new RelyingParty();
23+
24+
public String getDefaultTrustAnchor() {
25+
return defaultTrustAnchor;
26+
}
27+
28+
public Map<String, String> getIdentityProviders() {
29+
return identityProviders;
30+
}
31+
32+
public List<String> getTrustAnchors() {
33+
return trustAnchors;
34+
}
35+
36+
public RelyingParty getRelyingParty() {
37+
return relyingParty;
38+
}
39+
40+
public void setDefaultTrustAnchor(String defaultTrustAnchor) {
41+
this.defaultTrustAnchor = defaultTrustAnchor;
42+
}
43+
44+
public void setIdentityProviders(Map<String, String> identityProviders) {
45+
this.identityProviders = identityProviders;
46+
}
47+
48+
public void setTrustAnchors(List<String> trustAnchors) {
49+
this.trustAnchors = trustAnchors;
50+
}
51+
52+
public JSONObject toJSON() {
53+
JSONObject json = new JSONObject();
54+
55+
json.put("defaultTrustAnchor", defaultTrustAnchor);
56+
json.put("trustAnchors", trustAnchors);
57+
json.put("identityProviders", identityProviders);
58+
json.put("relyingParty", relyingParty.toJSON());
59+
60+
return json;
61+
}
62+
63+
public String toJSONString() {
64+
return toJSON().toString();
65+
}
66+
67+
public String toJSONString(int indentFactor) {
68+
return toJSON().toString(indentFactor);
69+
}
70+
71+
public static class RelyingParty {
72+
73+
private String applicationName;
74+
private String applicationType;
75+
private Set<String> contacts = new HashSet<>();
76+
private Set<String> scope = new HashSet<>();
77+
private String clientId;
78+
private Set<String> redirectUris = new HashSet<>();
79+
private String jwk;
80+
private String trustMarks;
81+
82+
public String getApplicationName() {
83+
return applicationName;
84+
}
85+
86+
public String getApplicationType() {
87+
return applicationType;
88+
}
89+
90+
public Set<String> getContacts() {
91+
return Collections.unmodifiableSet(contacts);
92+
}
93+
94+
public Set<String> getScope() {
95+
return Collections.unmodifiableSet(scope);
96+
}
97+
98+
public String getClientId() {
99+
return clientId;
100+
}
101+
102+
public Set<String> getRedirectUris() {
103+
return Collections.unmodifiableSet(redirectUris);
104+
}
105+
106+
public String getJwk() {
107+
return jwk;
108+
}
109+
110+
public String getTrustMarks() {
111+
return trustMarks;
112+
}
113+
114+
public void setApplicationName(String applicationName) {
115+
this.applicationName = applicationName;
116+
}
117+
118+
public void setApplicationType(String applicationType) {
119+
this.applicationType = applicationType;
120+
}
121+
122+
public void setClientId(String clientId) {
123+
this.clientId = clientId;
124+
}
125+
126+
public void setJwk(String jwk) {
127+
this.jwk = jwk;
128+
}
129+
130+
public void setTrustMarks(String trustMarks) {
131+
this.trustMarks = trustMarks;
132+
}
133+
134+
public void setContacts(Set<String> contacts) {
135+
this.contacts = contacts;
136+
}
137+
138+
public void setScope(Set<String> scope) {
139+
this.scope = scope;
140+
}
141+
142+
public void setRedirectUris(Set<String> redirectUris) {
143+
this.redirectUris = redirectUris;
144+
}
145+
146+
public JSONObject toJSON() {
147+
JSONObject json = new JSONObject();
148+
149+
json.put("applicationName", applicationName);
150+
json.put("applicationType", applicationType);
151+
json.put("contacts", contacts);
152+
json.put("scope", scope);
153+
json.put("clientId", clientId);
154+
json.put("redirectUris", redirectUris);
155+
json.put("jwk", jwk);
156+
json.put("trustMarks", trustMarks);
157+
158+
return json;
159+
}
160+
161+
public String toJSONString() {
162+
return toJSON().toString();
163+
}
164+
165+
public String toJSONString(int indentFactor) {
166+
return toJSON().toString(indentFactor);
167+
}
168+
}
169+
170+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package it.spid.cie.oidc.spring.boot.relying.party.controller;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.web.bind.annotation.RequestMapping;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
@RestController
9+
@RequestMapping("/oidc/rp")
10+
public class SpidController {
11+
12+
private static Logger logger = LoggerFactory.getLogger(SpidController.class);
13+
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package it.spid.cie.oidc.spring.boot.relying.party.controller;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpServletResponse;
5+
6+
import org.json.JSONObject;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.http.MediaType;
11+
import org.springframework.http.ResponseEntity;
12+
import org.springframework.web.bind.annotation.GetMapping;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
import org.springframework.web.bind.annotation.RequestParam;
15+
import org.springframework.web.bind.annotation.RestController;
16+
17+
import it.spid.cie.oidc.model.OIDCConstants;
18+
import it.spid.cie.oidc.schemas.WellKnownData;
19+
import it.spid.cie.oidc.spring.boot.relying.party.RelyingPartyWrapper;
20+
import it.spid.cie.oidc.spring.boot.relying.party.config.OidcConfig;
21+
22+
@RestController
23+
@RequestMapping("/oidc/rp")
24+
public class WellKnownController {
25+
26+
@GetMapping("/" + OIDCConstants.OIDC_FEDERATION_WELLKNOWN_URL)
27+
public ResponseEntity<String> wellKnownFederation(
28+
@RequestParam(required = false) String format,
29+
HttpServletRequest request, HttpServletResponse response)
30+
throws Exception {
31+
32+
boolean jsonMode = "json".equals(format);
33+
34+
WellKnownData wellKnown = relyingPartyWrapper.getWellKnownData(
35+
request.getRequestURL().toString(), jsonMode);
36+
37+
if (wellKnown.getStep() == WellKnownData.STEP_ONLY_JWKS) {
38+
logger.info(
39+
"Generated jwk. Please add it into 'application.yaml'.\n" +
40+
wellKnown.getValue());
41+
42+
String body = new JSONObject()
43+
.put("ERROR", "Do OnBoarding configuration")
44+
.toString();
45+
46+
return ResponseEntity.ok()
47+
.contentType(MediaType.APPLICATION_JSON)
48+
.body(body);
49+
}
50+
51+
if (jsonMode) {
52+
return ResponseEntity.ok()
53+
.contentType(MediaType.APPLICATION_JSON)
54+
.body(wellKnown.getValue());
55+
}
56+
else {
57+
return ResponseEntity.ok()
58+
.contentType(new MediaType("application", "entity-statement+jwt"))
59+
.body(wellKnown.getValue());
60+
}
61+
}
62+
63+
private static Logger logger = LoggerFactory.getLogger(SpidController.class);
64+
65+
@Autowired
66+
private OidcConfig oidcConfig;
67+
68+
@Autowired
69+
private RelyingPartyWrapper relyingPartyWrapper;
70+
71+
}

0 commit comments

Comments
 (0)