Skip to content

Commit a926806

Browse files
committed
Add README for authorization code flow
1 parent 5c2ade2 commit a926806

File tree

18 files changed

+128
-127
lines changed

18 files changed

+128
-127
lines changed

README.md

Lines changed: 33 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,61 +2,50 @@
22

33
Herzlich willkommen zum Workshop API Design.
44

5-
## Aufgabe: Authentifizierung mit JWT
5+
## Aufgabe: Implementierung des Authorization Code Flows
66

77
Starten Sie die Services mit Docker Compose:
88

9-
Unter [Customer Service](http://localhost:4000/webjars/swagger-ui/index.html)
10-
erreichen Sie die Swagger UI des Customer Service.
11-
12-
Wenn Sie dort versuchen, sich die Liste aller Kunden ausgeben zu lassen,
13-
werden Sie feststellen, dass Sie dies nicht dürfen.
14-
15-
### Holen eines Json Web Token
16-
17-
Mit dem folgenden HTTP-Aufruf können Sie ein Token erhalten:
18-
```
19-
POST http://localhost:9191/realms/master/protocol/openid-connect/token
20-
```
21-
Header:
22-
```
23-
Content-Type: application/x-www-form-urlencoded
249
```
25-
Body:
26-
```
27-
grant_type:password
28-
client_id:onlineshop
29-
username:erika
30-
password:erika123
10+
docker compose up --build
3111
```
3212

33-
Folgende Benutzer stehen zur Verfügung:
13+
Unter [Startseite](http://localhost:6060/index.html) finden Sie die Startseite.
14+
Der Login-Button ist allerdings noch funktionslos.
3415

35-
* admin / admin123 (role admin)
36-
* erika / erika123 (role user)
37-
* max / max123 (role user)
38-
* james / james123 (role user)
16+
Sie können die Startseite ändern, indem Sie `authentication-ui/static/index.html`
17+
bearbeiten.
3918

40-
Sie können die Authentifizierung auch über die
41-
[Swagger UI des Authentication Service](http://localhost:6060/)
42-
durchführen.
19+
Beim Klick auf den Login-Button soll ein Redirect auf den Authorization-Endpoint
20+
`http://localhost:9191/realms/master/protocol/openid-connect/auth` erfolgen.
21+
Dabei müssen folgende Query-Parameter übergeben werden:
4322

44-
### Analysieren des Tokens
23+
```
24+
client_id: "onlineshop"
25+
scope: "openid"
26+
response_type: "code"
27+
redirect_uri: <die eigene Seite>
28+
```
4529

46-
Das erhaltene Token ist base64-codiert.
47-
Man kann es sich unter [JWT.io](https://jwt.io) anschauen.
30+
Wenn das Login erfolgreich war,
31+
wird der Authorization-Server den Redirect ausführen
32+
und einen Query-Parameter namens `code` mitschicken.
33+
Dies ist der Authorization-Code.
4834

49-
### Aufruf des Services
35+
Mit dem Authorization Code kann nun ein POST-Request auf den Token-Endpoint
36+
`http://localhost:9191/realms/master/protocol/openid-connect/token`
37+
erfolgen.
38+
Der POST-Request wird mit dem Content-Type `application/x-www-form-urlencoded` ausgeführt.
39+
Dabei wird folgender Body mitgeschickt:
5040

51-
Das erhaltene JWT können Sie zur Authentifizierung beim
52-
[Customer Service](http://localhost:4000/webjars/swagger-ui/index.html)
53-
verwenden.
41+
```
42+
client_id: "onlineshop"
43+
scope: "openid"
44+
grant_type: "authorization_code"
45+
redirect_uri: <die eigene Seite>
46+
code: <<der Authorization Code>>
47+
```
5448

55-
### Authorisierung
49+
In der Antwort dieses Requests ist das JWT enthalten.
50+
Dieses kann nun auf der Startseite angezeigt werden.
5651

57-
Sie werden feststellen, dass sie auch mit dem Benutzer `erika`
58-
nicht alle Kunden sehen dürfen.
59-
Sie dürfen aber Kundendetails von `erika` (Kundennummer `0816`) sehen.
60-
Was müssen Sie tun, um alle Kunden abrufen zu können?
61-
Dürfen Sie auch die Details von Max Mustermann (Kundennummer `0815` sehen?
62-
Was ist das Problem?

authentication-ui/nginx.conf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
events {
2+
}
3+
http {
4+
5+
server {
6+
listen 8080;
7+
root /var/www;
8+
}
9+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<title>Onlineshop</title>
6+
</head>
7+
<body>
8+
<h1>Onlineshop</h1>
9+
<button id="loginButton">Login</button>
10+
<div id="result"></div>
11+
<script>
12+
document.getElementById("loginButton").onclick = function() {
13+
console.log("Redirect to authentication server");
14+
}
15+
16+
if (window.location.search) {
17+
var args = new URLSearchParams(window.location.search);
18+
var code = args.get("code");
19+
20+
if (code) {
21+
console.log("Authenticate with authorization code");
22+
}
23+
}
24+
</script>
25+
</body>
26+
</html>

customer-service/src/main/java/de/openknowledge/sample/address/infrastructure/CorsFilter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package de.openknowledge.sample.address.infrastructure;
1717

18+
import javax.enterprise.context.ApplicationScoped;
1819
import javax.ws.rs.container.ContainerRequestContext;
1920
import javax.ws.rs.container.ContainerResponseContext;
2021
import javax.ws.rs.container.ContainerResponseFilter;
@@ -24,6 +25,7 @@
2425
* Filter to allow cross origin calls.
2526
*/
2627
@Provider
28+
@ApplicationScoped
2729
public class CorsFilter implements ContainerResponseFilter {
2830

2931
@Override

customer-service/src/main/java/de/openknowledge/sample/address/infrastructure/ValidationExceptionHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package de.openknowledge.sample.address.infrastructure;
1717

18+
import javax.enterprise.context.ApplicationScoped;
1819
import javax.validation.ValidationException;
1920
import javax.ws.rs.core.Context;
2021
import javax.ws.rs.core.Response;
@@ -23,6 +24,7 @@
2324
import javax.ws.rs.ext.Provider;
2425

2526
@Provider
27+
@ApplicationScoped
2628
public class ValidationExceptionHandler implements ExceptionMapper<ValidationException> {
2729

2830
private static final String PROBLEM_JSON_TYPE = "application/problem+json";

customer-service/src/main/java/de/openknowledge/sample/customer/application/CustomerApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package de.openknowledge.sample.customer.application;
1717

18+
import javax.enterprise.context.ApplicationScoped;
1819
import javax.ws.rs.ApplicationPath;
1920
import javax.ws.rs.core.Application;
2021

@@ -23,6 +24,7 @@
2324
/**
2425
* Application initialization
2526
*/
27+
@ApplicationScoped
2628
@ApplicationPath("/")
2729
@LoginConfig(authMethod = "MP-JWT")
2830
public class CustomerApplication extends Application {
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright 2019 open knowledge GmbH
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package de.openknowledge.sample.customer.application;
17+
18+
import static java.lang.System.lineSeparator;
19+
import static java.util.stream.Collectors.joining;
20+
21+
import java.io.BufferedReader;
22+
import java.io.IOException;
23+
import java.io.InputStream;
24+
import java.io.InputStreamReader;
25+
26+
import javax.annotation.security.PermitAll;
27+
import javax.enterprise.context.ApplicationScoped;
28+
import javax.ws.rs.GET;
29+
import javax.ws.rs.Path;
30+
import javax.ws.rs.Produces;
31+
import javax.ws.rs.core.MediaType;
32+
33+
/**
34+
* RESTFul endpoint for customers
35+
*/
36+
@ApplicationScoped
37+
@Path("/")
38+
@Produces(MediaType.TEXT_HTML)
39+
public class LoginResource {
40+
41+
@GET
42+
@PermitAll
43+
@Path("index.html")
44+
public String getCustomers() throws IOException {
45+
try (InputStream in = LoginResource.class.getResourceAsStream("index.html");
46+
BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
47+
return reader.lines().collect(joining(lineSeparator()));
48+
}
49+
}
50+
}

customer-service/src/test/resources/META-INF/beans.xml

Lines changed: 0 additions & 11 deletions
This file was deleted.

customer-service/src/test/resources/de/openknowledge/sample/customer/erika-with-addresses.json

Lines changed: 0 additions & 12 deletions
This file was deleted.

customer-service/src/test/resources/de/openknowledge/sample/customer/erika.json

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)