Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Advanced API Security with Spring Security OAuth

baeldung
March 04, 2016

Advanced API Security with Spring Security OAuth

The structure of this presentation focuses on the following:
- An intro to Security Tokens
- Understand OAuth2
- An OAuth implementation for a REST API with Spring Security
- How to consume the secured API from a JS client
- Understanding security threats in OAuth

baeldung

March 04, 2016
Tweet

More Decks by baeldung

Other Decks in Technology

Transcript

  1. . . . . . . . . . .

    . . . Advanced API Security - Workshop HI • My name is Eugen Paraschiv • I’ve been running Baeldung for almost 5 years • And I’ve written quite a few Oauth implementations
  2. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Get you comfortable with OAuth at a high level and get you started implementing it cleanly with Spring Security WORKSHOP GOAL
  3. Advanced API Security - Workshop • An intro to Security

    Tokens • Understand OAuth2 AGENDA
  4. Advanced API Security - Workshop • An intro to Security

    Tokens • Understand OAuth2 • An OAuth implementation for a REST API with Spring Security AGENDA
  5. Advanced API Security - Workshop • An intro to Security

    Tokens • Understand OAuth2 • An OAuth implementation for a REST API with Spring Security • How to consume the secured API from a JS client AGENDA
  6. Advanced API Security - Workshop • An intro to Security

    Tokens • Understand OAuth2 • An OAuth implementation for a REST API with Spring Security • How to consume the secured API from a JS client • Understanding security threats AGENDA
  7. . . . . . . . . . .

    . . . . OPEN QUESTION TIME Have you ever used OAuth to secure a system before?
  8. . . . . . . . . . .

    . . . . I. Security Tokens
  9. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The history of Security Tokens Security Tokens
  10. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The history of Security Tokens • The structure of a Security Token Security Tokens
  11. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The history of Security Tokens • The structure of a Security Token • JSON Web Tokens (JWT) Security Tokens
  12. . . . . . . . . . .

    . . . Advanced API Security - Workshop • SAML – XML Based – Lots of encryption and signature options The History of Security Tokens
  13. . . . . . . . . . .

    . . . Advanced API Security - Workshop • SAML – XML Based – Lots of encryption and signature options • Simple Web Token – Form / URL encoded – Symmetric signatures only The History of Security Tokens
  14. . . . . . . . . . .

    . . . Advanced API Security - Workshop • SAML – XML Based – Lots of encryption and signature options • Simple Web Token – Form / URL encoded – Symmetric signatures only • JSON Web Tokens (JWT) – JSON Encoded – Symmetric and asymmetric signatures – Symmetric and asymmetric encryption The History of Security Tokens
  15. . . . . . . . . . .

    . . . Advanced API Security - Workshop • A Security Token contains information about: – The Issuer – The Recipient – The Subject – An Expiration Time (usually) The Structure of a Security Token
  16. . . . . . . . . . .

    . . . Advanced API Security - Workshop • A Security Token contains information about: – The Issuer – The Recipient – The Subject – An Expiration Time (usually) • Tokens are typically signed (symmetrically or asymmetrically) The Structure of a Security Token
  17. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The simple, high-level structure of a JWT Token is: – [header].[payload].[signature] JWT
  18. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The simple, high-level structure of a JWT Token is: – [header].[payload].[signature] • It’s self-contained JWT
  19. . . . . . . . . . .

    . . . Advanced API Security - Workshop • eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3O DkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95 OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ JWT EXAMPLE
  20. . . . . . . . . . .

    . . . Advanced API Security - Workshop • A Header example: JWT HEADER EXAMPLE { "alg": "HS256“, "typ": "JWT" }
  21. . . . . . . . . . .

    . . . Advanced API Security - Workshop • A Payload example: JWT PAYLOAD EXAMPLE { "iss": "scotch.io", "exp": 1300819380, "name": "Chris Sevilleja", "admin": true }
  22. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Signature contains: – The Header (Base64 URL encoded) – The Payload (Base64 URL encoded) – A Secret JWT SIGNATURE
  23. . . . . . . . . . .

    . . . . PLAY TIME Let’s hit a real Authorization Server
  24. . . . . . . . . . .

    . . . . STOP Q&A Time
  25. . . . . . . . . . .

    . . . . II. What is OAuth2?
  26. . . . . . . . . . .

    . . . Advanced API Security - Workshop • OAuth2 is an Authorization protocol OAuth2
  27. . . . . . . . . . .

    . . . Advanced API Security - Workshop • OAuth2 is an Authorization protocol • A client can get limited access without asking for the master key OAuth2
  28. . . . . . . . . . .

    . . . Advanced API Security - Workshop • OAuth2 is an Authorization protocol • A client can get limited access without asking for the master key • A strong reason for OAuth2 - mobile OAuth2
  29. Advanced API Security - Workshop THE OAUTH ACTORS Client Resource

    Owner Resource Server uses owns a Resource
  30. Advanced API Security - Workshop THE OAUTH ACTORS Client Resource

    Owner Authorization Server Resource Server uses owns a Resource trusts
  31. Advanced API Security - Workshop THE OAUTH ACTORS Client Resource

    Owner Authorization Server Resource Server uses owns a Resource trusts registers with … issues access token
  32. Advanced API Security - Workshop THE OAUTH ACTORS Client Resource

    Owner Authorization Server Resource Server uses owns a Resource trusts registers with … issues access token
  33. Advanced API Security - Workshop THE OAUTH ACTORS Client Resource

    Owner Authorization Server Resource Server uses owns a Resource trusts registers with … issues access token
  34. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Authorization Code Flow OAUTH2 FLOWS
  35. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Authorization Code Flow • Implicit Flow OAUTH2 FLOWS
  36. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Authorization Code Flow • Implicit Flow • Resource Owner Password Credentials Flow OAUTH2 FLOWS
  37. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Authorization Code Flow • Implicit Flow • Resource Owner Password Credentials Flow • Client Credentials Flow OAUTH2 FLOWS
  38. . . . . . . . . . .

    . . . . STOP Q&A Time
  39. . . . . . . . . . .

    . . . . IMPLEMENTATION - SCENARIO 1 A minimal OAuth2 setup
  40. . . . . . . . . . .

    . . . Advanced API Security - Workshop SPRING SECURITY OAUTH <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version>2.0.8.RELEASE</version> </dependency>
  41. . . . . . . . . . .

    . . . Advanced API Security - Workshop THE AUTHORIZATION SERVER @SpringBootApplication @EnableAuthorizationServer public class AuthServer extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(AuthserverApplication.class, args); } }
  42. . . . . . . . . . .

    . . . Advanced API Security - Workshop THE AUTHORIZATION SERVER @SpringBootApplication @EnableAuthorizationServer public class AuthServer extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(AuthserverApplication.class, args); } }
  43. . . . . . . . . . .

    . . . Advanced API Security - Workshop THE AUTHORIZATION SERVER @SpringBootApplication @EnableAuthorizationServer public class AuthServer extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(AuthserverApplication.class, args); } }
  44. . . . . . . . . . .

    . . . Advanced API Security - Workshop AUTH SERVER - application.properties ... security.oauth2.client.clientId: sampleClientId security.oauth2.client.clientSecret: set_your_secret security.oauth2.client.authorized-grant-types: password security.oauth2.client.scope: read
  45. . . . . . . . . . .

    . . . Advanced API Security - Workshop AUTH SERVER – JAVA CONFIG @Override public void configure (ClientDetailsServiceConfigurer clients) throws Exception { clients. … .withClient(" sampleClientId ") .secret("set_your_secret") .authorizedGrantTypes("password") .scopes("read"); }
  46. . . . . . . . . . .

    . . . Advanced API Security - Workshop RUN THE AUTH SERVER (BOOT) … server.port=8081 security.user.password=password server.contextPath=/auth …
  47. . . . . . . . . . .

    . . . Advanced API Security - Workshop THE RESOURCE SERVER @SpringBootApplication @EnableResourceServer public class ResourceApplication extends ResourceServerConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(ResourceApplication.class, args); } }
  48. . . . . . . . . . .

    . . . . Play Time Let’s now get an Access Token and consume the REST API with it
  49. . . . . . . . . . .

    . . . . IMPLEMENTATION - SCENARIO 2 Let’s now switch from standard tokens to JWT
  50. Advanced API Security - Workshop AUTH SERVER - JWT <dependency>

    <groupId>org.springframework.security</groupId> <artifactId>spring-security-jwt</artifactId> </dependency>
  51. Advanced API Security - Workshop AUTH SERVER - JWT @Bean

    public JwtAccessTokenConverter accessTokenConverter() { JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); converter.setSigningKey(signingKey); return converter; } @Bean public TokenStore tokenStore() { return new JwtTokenStore(accessTokenConverter()); }
  52. Advanced API Security - Workshop AUTH SERVER - JWT @Bean

    @Primary public DefaultTokenServices tokenServices() { DefaultTokenServices tokenServices = new DefaultTokenServices(); tokenServices.setTokenStore(tokenStore()); return tokenServices; }
  53. Advanced API Security - Workshop AUTH SERVER - JWT @Override

    public void configure(AuthorizationServerEndpointsConfigurer conf) { conf. tokenStore(tokenStore()). allowedTokenEndpointRequestMethods(GET, POST). accessTokenConverter(accessTokenConverter()); }
  54. Advanced API Security - Workshop RESOURCE SERVER - JWT @Bean

    public JwtAccessTokenConverter accessTokenConverter() { JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); converter.setSigningKey(signingKey); return converter; } @Bean public TokenStore tokenStore() { … } @Bean @Primary public DefaultTokenServices tokenServices() { … }
  55. Advanced API Security - Workshop RESOURCE SERVER - JWT @Override

    public void configure(ResourceServerSecurityConfigurer config) { config.tokenServices(tokenServices()); }
  56. . . . . . . . . . .

    . . . . Play Time Let’s now get an Access Token and consume the REST API with it
  57. . . . . . . . . . .

    . . . . IMPLEMENTATION - SCENARIO 3 Introducing Refresh Tokens
  58. . . . . . . . . . .

    . . . Advanced API Security - Workshop AUTH SERVER – REFRESH TOKEN @Override public void configure (ClientDetailsServiceConfigurer clients) throws Exception { clients. … .authorizedGrantTypes("password", "refresh_token") .refreshTokenValiditySeconds(2592000) // 30 days }
  59. . . . . . . . . . .

    . . . Advanced API Security - Workshop AUTH SERVER – REFRESH TOKEN @Bean public DefaultTokenServices tokenServices() { … tokenServices.setSupportRefreshToken(true); return tokenServices; }
  60. . . . . . . . . . .

    . . . . Play Time Let’s see the new Refresh Token in action
  61. . . . . . . . . . .

    . . . . STOP Q&A Time
  62. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Using User Authorities is an OK option for authorization GRANULAR AUTHORIZATION WITH OAUTH
  63. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Using User Authorities is an OK option for authorization • Scopes are also a good option to drive granular authorization GRANULAR AUTHORIZATION WITH OAUTH
  64. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Using User Authorities is an OK authorization option • Scopes are also a good option to drive granular authorization • In the Password Flow, scopes can be complex to implement GRANULAR AUTHORIZATION WITH OAUTH
  65. . . . . . . . . . .

    . . . . STOP Q&A Time
  66. . . . . . . . . . .

    . . . . The Client Side IV. Token Storage in the Browser
  67. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Access Token – stored by the JS using a Cookie – short lived – 2 minutes STORING THE ACCESS TOKEN
  68. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Access Token – stored by the JS using a Cookie – short lived – 2 minutes – the cookie does not drive authentication STORING THE ACCESS TOKEN
  69. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Access Token – stored by the JS using a Cookie – short lived – 2 minutes – the cookie does not drive authentication – it’s only used for storage STORING THE ACCESS TOKEN
  70. . . . . . . . . . .

    . . . Advanced API Security - Workshop THE CLIENT – ACCESS TOKEN var req = { method: 'POST', url: "oauth/token", headers: {"Content-type": "application/x-www-form-urlencoded"}, data: $httpParamSerializer(params) }
  71. . . . . . . . . . .

    . . . Advanced API Security - Workshop THE CLIENT – ACCESS TOKEN $http(req).then(function(data){ // success }, function(){ console.log("error"); window.location.href = "login"; } );
  72. . . . . . . . . . .

    . . . Advanced API Security - Workshop THE CLIENT – ACCESS TOKEN $http.defaults.headers.common.Authorization = 'Bearer ' + data.data.access_token;
  73. . . . . . . . . . .

    . . . Advanced API Security - Workshop THE CLIENT – ACCESS TOKEN $http.defaults.headers.common.Authorization = 'Bearer ' + data.data.access_token; // save the Access Token var expireDate = new Date( new Date().getTime() + (1000 * data.data.expires_in));
  74. . . . . . . . . . .

    . . . Advanced API Security - Workshop THE CLIENT – ACCESS TOKEN $http.defaults.headers.common.Authorization = 'Bearer ' + data.data.access_token; // save the Access Token var expireDate = new Date( new Date().getTime() + (1000 * data.data.expires_in)); $cookies.put("access_token", data.data.access_token, {'expires': expireDate});
  75. . . . . . . . . . .

    . . . Advanced API Security - Workshop THE CLIENT – ACCESS TOKEN $http.defaults.headers.common.Authorization = 'Bearer ' + data.data.access_token; // save the Access Token var expireDate = new Date( new Date().getTime() + (1000 * data.data.expires_in)); $cookies.put("access_token", data.data.access_token, {'expires': expireDate}); window.location.href = "index";
  76. . . . . . . . . . .

    . . . . The Refresh Token
  77. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Cookie is secure (HTTPS only - no network sniffing attacks) THE REFRESH TOKEN – IN A COOKIE
  78. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Cookie is secure (HTTPS only - no network sniffing attacks) • The Cookie is HTTP only (no JS - no XSS attacks) THE REFRESH TOKEN – IN A COOKIE
  79. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Cookie is secure (HTTPS only - no network sniffing attacks) • The Cookie is HTTP only (no JS - no XSS attacks) • The Cookie has a very specific path (/oauth/path) THE REFRESH TOKEN – IN A COOKIE
  80. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Cookie is secure (HTTPS only - no network sniffing attacks) • The Cookie is HTTP only (no JS - no XSS attacks) • The Cookie has a very specific path (/oauth/path) • /oauth/path has CSRF protection THE REFRESH TOKEN – IN A COOKIE
  81. . . . . . . . . . .

    . . . Advanced API Security - Workshop • By default, the Refresh Token is returned with the Access Token JSON HOW DO WE WORK WITH THE COOKIE?
  82. . . . . . . . . . .

    . . . Advanced API Security - Workshop • By default, the Refresh Token is returned with the Access Token JSON • We will intercept that Request <-> Response and make changes HOW DO WE WORK WITH THE COOKIE?
  83. . . . . . . . . . .

    . . . Advanced API Security - Workshop • By default, the Refresh Token is returned with the Access Token JSON • We will intercept that Request <-> Response and make changes • We’ll use the Zuul Proxy to make the changes on the Request / Response HOW DO WE WORK WITH THE COOKIE?
  84. . . . . . . . . . .

    . . . Advanced API Security - Workshop • When we obtain an Access Token, we also receive the Refresh Token OBTAINING THE TOKENS - THE RESPONSE
  85. . . . . . . . . . .

    . . . Advanced API Security - Workshop • When we obtain an Access Token, we also receive the Refresh Token • The Proxy will get the value from the JSON Body and set it to the Cookie OBTAINING THE TOKENS - THE RESPONSE
  86. . . . . . . . . . .

    . . . Advanced API Security - Workshop • When we refresh the Access Token, the Cookie will be sent by the Browser REFRESHING THE ACCESS TOKEN
  87. . . . . . . . . . .

    . . . Advanced API Security - Workshop • When we refresh the Access Token, the Cookie will be sent by the Browser • The Proxy will get the Refresh Token value from the Cookie REFRESHING THE ACCESS TOKEN
  88. . . . . . . . . . .

    . . . Advanced API Security - Workshop • When we refresh the Access Token, the Cookie will be sent by the Browser • The Proxy will get the Refresh Token value from the Cookie • And it will add it as a parameter on the Request REFRESHING THE ACCESS TOKEN
  89. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The JS Client can now trigger a refresh of the token behind the scenes • The JS Client can also intercept a 401 Response and refresh the token THE CLIENT – DOING REFRESH
  90. . . . . . . . . . .

    . . . . STOP Q&A Time
  91. . . . . . . . . . .

    . . . . THE OAUTH2 THREAT MODEL V. Let’s explore some security attacks
  92. . . . . . . . . . .

    . . . Advanced API Security - Workshop • We are not using Cookies to drive authentication CSRF Vulnerability?
  93. . . . . . . . . . .

    . . . Advanced API Security - Workshop • We are not using Cookies to drive authentication • We are not using Cookies to drive authentication (mostly) CSRF Vulnerability?
  94. . . . . . . . . . .

    . . . Advanced API Security - Workshop • We are not using Cookies to drive authentication • We are not using Cookies to drive authentication (mostly) • The Refresh Token is using a Cookie on /oauth/token CSRF Vulnerability?
  95. . . . . . . . . . .

    . . . Advanced API Security - Workshop • We are not using Cookies to drive authentication • We are not using Cookies to drive authentication (mostly) • The Refresh Token is using a Cookie on /oauth/token • So we need CSRF protection on /oauth/token only CSRF Vulnerability?
  96. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Browser sends security information implicitly HOW CSRF WORKS
  97. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Browser sends security information implicitly • So any site can send a request to our API HOW CSRF WORKS
  98. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Browser sends security information implicitly • So any site can send a request to our API • And because the browser is indeed authenticated with our API HOW CSRF WORKS
  99. . . . . . . . . . .

    . . . Advanced API Security - Workshop • The Browser sends security information implicitly • So any site can send a request to our API • And because the browser is indeed authenticated with our API • That request will be valid and will go through HOW CSRF WORKS
  100. . . . . . . . . . .

    . . . Advanced API Security - Workshop • We check the Referrer header of the Request SOLUTIONS
  101. . . . . . . . . . .

    . . . Advanced API Security - Workshop • We check the Referrer header of the Request (Week) SOLUTIONS
  102. . . . . . . . . . .

    . . . Advanced API Security - Workshop • We check the Referrer header of the Request (Week) • We check the Origin header of the Request SOLUTIONS
  103. . . . . . . . . . .

    . . . Advanced API Security - Workshop • We check the Referrer header of the Request (Week) • We check the Origin header of the Request (Better) SOLUTIONS
  104. . . . . . . . . . .

    . . . Advanced API Security - Workshop • We check the Referrer header of the Request (Week) • We check the Origin header of the Request (Better) • We use the Synchronizer Token Pattern to stop CSRF attacks SOLUTIONS
  105. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Use HTTPS only REPLAY ATTACKS
  106. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Use HTTPS only • Sign requests and use nonces and timestamps to uniquely identify requests REPLAY ATTACKS
  107. . . . . . . . . . .

    . . . Advanced API Security - Workshop • This attack is orchestrated with a counterfeit Resource Server ACCESS TOKEN PHISHING
  108. . . . . . . . . . .

    . . . Advanced API Security - Workshop • This attack is orchestrated with a counterfeit Resource Server • The endpoint URL of the Resource Server should be hard set in the Client ACCESS TOKEN PHISHING
  109. . . . . . . . . . .

    . . . . STOP Q&A Time
  110. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Authentication in OAuth2 (OpenID Connect) OTHER POINTS TO HIT ON
  111. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Authentication in OAuth2 (OpenID Connect) • How do we revoke Tokens OTHER POINTS TO HIT ON
  112. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Authentication in OAuth2 (OpenID Connect) • How do we revoke Tokens • Encrypting tokens in the browser OTHER POINTS TO HIT ON
  113. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Authentication in OAuth2 (OpenID Connect) • How do we revoke Tokens • Encrypting tokens in the browser • Protecting the Login against CSRF Attacks OTHER POINTS TO HIT ON
  114. . . . . . . . . . .

    . . . Advanced API Security - Workshop • Authentication in OAuth2 (OpenID Connect) • How do we revoke Tokens • Encrypting tokens in the browser • Protecting the Login against CSRF Attacks • How exactly do we do granular authorization? OTHER POINTS TO HIT ON
  115. ADVANCED API SECURITY “CQRS and Event Sourcing With Spring Boot”

    2 Hour Workshop (129$) • Separate Reads from Writes in a Spring API using CQRS
  116. ADVANCED API SECURITY “CQRS and Event Sourcing With Spring Boot”

    2 Hour Workshop (129$) • Separate Reads from Writes in a Spring API using CQRS • Implement our Event Store and persist raw JSON events
  117. ADVANCED API SECURITY “CQRS and Event Sourcing With Spring Boot”

    2 Hour Workshop (129$) • Separate Reads from Writes in a Spring API using CQRS • Implement our Event Store and persist raw JSON events • Go from Commands to Events with a Spring 4.2+ impl
  118. ADVANCED API SECURITY “CQRS and Event Sourcing With Spring Boot”

    2 Hour Workshop (129$) • Project Events into useful, eventually-consistent views
  119. ADVANCED API SECURITY “CQRS and Event Sourcing With Spring Boot”

    2 Hour Workshop (129$) • Project Events into useful, eventually-consistent views • Leverage Polyglot Persistence for our Projections
  120. ADVANCED API SECURITY “CQRS and Event Sourcing With Spring Boot”

    2 Hour Workshop (129$) • Project Events into useful, eventually-consistent views • Leverage Polyglot Persistence for our Projections • Discuss transactional semantics across Projections
  121. ADVANCED API SECURITY “CQRS and Event Sourcing With Spring Boot”

    2 Hour Workshop (129$) • Project Events into useful, eventually-consistent views • Leverage Polyglot Persistence for our Projections • Discuss transactional semantics across Projections • Deal with Eventual Consistency from the client side
  122. ADVANCED API SECURITY “Advanced API Discoverability and HATEOAS” 2 Hour

    Workshop (99$) • Use Spring HATEOAS for dynamic link building
  123. ADVANCED API SECURITY “Advanced API Discoverability and HATEOAS” 2 Hour

    Workshop (99$) • Use Spring HATEOAS for dynamic link building • Return relations as full embedded Resources vs. Links
  124. ADVANCED API SECURITY “Advanced API Discoverability and HATEOAS” 2 Hour

    Workshop (99$) • Use Spring HATEOAS for dynamic link building • Return relations as full embedded Resources vs. Links • Implement fetch plans / field plans
  125. ADVANCED API SECURITY “Advanced API Discoverability and HATEOAS” 2 Hour

    Workshop (99$) • Use Spring HATEOAS for dynamic link building • Return relations as full embedded Resources vs. Links • Implement fetch plans / field plans • Build a custom Media Type and why that's useful
  126. ADVANCED API SECURITY Workshop Bonus (next 48 hours) “All In

    One” Workshops: 124$ (50% Off) - “Advanced API Discoverability and HATEOAS” - “CQRS and Event Sourcing With Spring Boot”
  127. . . . . . . . . . .

    . . . . THANK YOU It’s Q&A Time