This tutorial will walk you through the steps of creating a Single Sign Out Example with JSON Web Token (JWT), Spring Boot and Redis.

Spring Boot Hello World Series:
- Spring Boot Hello World Example with FreeMarker
- Spring Boot Hello World Example with Thymeleaf
- Spring Boot Hello World Example with JSP

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 and localhost:8280.

What you'll need

  • JDK 1.7+
  • Maven 3+
  • Redis

Stack

  • Java
  • Single Sign On/Out
  • JSON Web Token
  • Redis
  • Spring Boot
  • Freemarker

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

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

Source code

[email protected]:hellokoding/single-sign-on-out-jwt-cookie-redis-java-springboot-freemarker.git
https://github.com/hellokoding/single-sign-on-out-jwt-cookie-redis-java-springboot-freemarker

single-sign-on-out-jwt-cookie-redis-java-springboot-freemarker.git is a git submodules project. You may clone it using this command

git clone --recurse-submodules -j8 [email protected]:hellokoding/single-sign-on-out-jwt-cookie-redis-java-springboot-freemarker.git