This tutorial will walk you through the steps of creating a Single Log Out (SLO) Example with JSON Web Token (JWT), Spring Boot, and Redis
What you'll build
You'll build 3 separated services:
1 Authentication Service: will be deployed at
localhost:8080
.2 Resource Services (to simplify, we use the same code base): will be deployed at
localhost:8180
andlocalhost:8280
.
What you'll need
- JDK 1.7+
- Maven 3+
- Redis
Stack
- Java
- Single Sign On/Out
- JSON Web Token
- Redis
- Spring Boot
- Freemarker
Build Authentication Service
Project structure
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── hellokoding
│ │ └── sso
│ │ └── auth
│ │ ├── CookieUtil.java
│ │ ├── JwtUtil.java
│ │ ├── LoginController.java
│ │ ├── RedisUtil.java
│ │ └── WebApplication.java
│ └── resources
│ └── templates
│ └── login.ftl
└── pom.xml
Project dependencies
CookieUtil
JWT Token'll be saved to and extracted from browser cookies.
cookie.setSecure(secure)
: secure=true => work on HTTPS only.
cookie.setHttpOnly(true)
: invisible to JavaScript.
cookie.setMaxAge(maxAge)
: maxAge=0: expire cookie now, maxAge<0: expire cookiie on browser exit.
cookie.setDomain(domain)
: visible to domain
only.
cookie.setPath("/")
: visible to all paths.
JwtUtil
We use JJWT to generate/parse JWT Token.
RedisUtil
LoginController
To simplify, we use a HashMap (credentials
) as user database.
View Template
Application Configuration
Run
mvn clean spring-boot:run
Build Resource Service
Project structure
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── hellokoding
│ │ └── sso
│ │ └── resource
│ │ ├── CookieUtil.java
│ │ ├── JwtFilter.java
│ │ ├── JwtUtil.java
│ │ ├── RedisUtil.java
│ │ ├── ResourceController.java
│ │ └── WebApplication.java
│ └── resources
│ ├── application.properties
│ └── templates
│ └── protected-resource.ftl
└── pom.xml
Project dependencies
JwtFilter
JwtFilter enforces SSO. If JWT Token's not existed (unauthenticated), redirects to Authentication Service. If JWT Token's existed (authenticated), extracts user identity and forwards the request.
ResourceController
View Template
Application Configuration
Run
Resource Service 1
mvn clean spring-boot:run -Dserver.port=8180
Resource Service 2
mvn clean spring-boot:run -Dserver.port=8280