Implementing an OAuth 2 authorization server with Spring Security - the new way! by Laurentiu Spilca

Поделиться
HTML-код
  • Опубликовано: 11 янв 2025
  • Spring I/O 2022 - Barcelona, 26-27 May
    After project Spring Security OAuth has been deprecated, there was a lot of confusion in the community. You could use Spring Security to write the resource server but not the authorization server. But the dark age is now over.
    In this session, we discuss implementing an authorization server using the new Spring Security Authorization Server project. spring.io/blog...
    OAuth 2 and OpenID Connect are tremendously important today since they represent the most used standards for implementing authentication in apps. Spring apps are no exception to this approach. We’ll start with a refresher on OAuth 2 and OpenID Connect and remember shortly how an authorization server was configured using the Spring Security OAuth project (now deprecated). Then, we’ll work on an example where we implement an authorization server using the new approach -the Spring Security Authorization Server project. You’ll learn how to use the new project to write your custom authorization server but also what advantages does this project brings above the old-fashioned way.

Комментарии • 55

  • @joshzoolian7821
    @joshzoolian7821 Год назад +10

    In looking through dozens of sites advising on this topic, it was super handy hearing him mention deprecated methods and implementations

  • @HenrryWith2Rs
    @HenrryWith2Rs 2 года назад +10

    I love this guys channel. He really knows his stuff.

  • @adrianstefan1814
    @adrianstefan1814 Год назад

    Laur is a great teacher. I learned a lot from him!

  • @mohamedibrahim1836
    @mohamedibrahim1836 Год назад

    how the resource server knows this token is from the authorization server? minute 7:36 the diagram misses this point .

  • @alxdm9760
    @alxdm9760 2 года назад +3

    what about if i dont want jwt tokens? just like the old way which is using opaque token, is it possible? especially if the auth server and reaource server are in one project? hope you can have a demo

  • @arulmurugansubramaniam8452
    @arulmurugansubramaniam8452 2 года назад +3

    How are you generation code verifier?

  • @Pradip_Dhungel
    @Pradip_Dhungel 2 года назад +1

    Great Explanation of OAUTH .......

  • @ridhopratama9639
    @ridhopratama9639 11 месяцев назад

    Help. It is statefull, isn't it?? because no sessionCreationPolicy configuration written. like customizer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)

  • @nihmathaafiya9693
    @nihmathaafiya9693 Год назад +3

    I'm a beginner, I'm not really sure as to how that code_challenge was generated, can someone explain it?

    • @jofrantoba
      @jofrantoba Год назад

      public static void main(String[] args) throws NoSuchAlgorithmException {
      SpringApplication.run(Application.class, args);
      String codeVerifier=createCodeVerifier();
      log.info("code verifier:"+codeVerifier);
      log.info("code_challenge:"+createCodeChallenge(codeVerifier));
      }

      private static String createCodeChallenge(String value) throws NoSuchAlgorithmException {
      MessageDigest md = MessageDigest.getInstance("SHA-256");
      byte[] digest = md.digest(value.getBytes(StandardCharsets.US_ASCII));
      return Base64.getUrlEncoder().withoutPadding().encodeToString(digest);
      }

      private static String createCodeVerifier(){
      StringKeyGenerator secureKeyGenerator =
      new Base64StringKeyGenerator(Base64.getUrlEncoder().withoutPadding(), 96);
      return secureKeyGenerator.generateKey();
      }

  • @mayankgupta2543
    @mayankgupta2543 Год назад

    Can we have multiple authentication manager configured for different purpose if yes then how?

  • @vishaldas1665
    @vishaldas1665 Месяц назад

    Hello every one I am trying to setup this, an Interesting issue is happening, when I try the authorize request on an anonymous context it goes to error page with code 999, but it I try it on a logged in uses it works, do any one knows this?

  • @rahmonaliyoqubov
    @rahmonaliyoqubov 2 года назад +2

    Hi. Can i use a jjwt implementation instead of nimbous jwt?

  • @yuyeyang4973
    @yuyeyang4973 2 года назад +2

    Does JWT need to be stored on the server?

  • @ngocanha85
    @ngocanha85 Год назад +1

    Rename ProviderSettings -> AuthorizationServerSettings

  • @陈俏锋
    @陈俏锋 8 месяцев назад

    I love this presentation! How to get the code and file on your presentation?

  • @csvxmlfan3853
    @csvxmlfan3853 2 года назад +2

    at the post request i'll always get {"error":"invalid_client"}, stackoverflow and github show solutions but only for version 0.2.. has someone an idea?

    • @csvxmlfan3853
      @csvxmlfan3853 2 года назад +1

      Ahh ok, so of course postman has the role in this example of a public client as such the clientAuthenticationMethod has to be ClientAuthenticationMethod.NONE according to registeredClient documentation... So either Mr. Spilca changed it and did no show it or he used some other trick..

    • @victormartin6264
      @victormartin6264 2 года назад +3

      @@csvxmlfan3853 the trick is the hidden Authorization tab in postman. Try adding --header 'Authorization: Basic Y2xpZW50OnNlY3JldA=='

    • @arsenmemetov5794
      @arsenmemetov5794 2 года назад +6

      @CSVXML FAN, Víctor Martín is right, you have to pass client_id and client_secret using Authorization Header: In Postman's Authorization tab select 'Basic Auth' in 'Type' dropdown menu and then type client_id/client_secret in appeared Username/Password fields.

  • @fredzouza
    @fredzouza 2 года назад +2

    Please can someone help me with the "code_challenge" i need to generate a SHA256 from any string like "anything" and in "code_verifier" i send "anything" ?

    • @jafajarvis324
      @jafajarvis324 2 года назад

      same question i have... if you find any solution please let me know

    • @jofrantoba
      @jofrantoba Год назад

      public static void main(String[] args) throws NoSuchAlgorithmException {
      SpringApplication.run(Application.class, args);
      String codeVerifier=createCodeVerifier();
      log.info("code verifier:"+codeVerifier);
      log.info("code_challenge:"+createCodeChallenge(codeVerifier));
      }

      private static String createCodeChallenge(String value) throws NoSuchAlgorithmException {
      MessageDigest md = MessageDigest.getInstance("SHA-256");
      byte[] digest = md.digest(value.getBytes(StandardCharsets.US_ASCII));
      return Base64.getUrlEncoder().withoutPadding().encodeToString(digest);
      }

      private static String createCodeVerifier(){
      StringKeyGenerator secureKeyGenerator =
      new Base64StringKeyGenerator(Base64.getUrlEncoder().withoutPadding(), 96);
      return secureKeyGenerator.generateKey();
      }

  • @testingdave7629
    @testingdave7629 Год назад +2

    If I am going to user Redis to store token data, how do I create a filter that will fetch the token first on Redis before proceeding with the checking of JWT? I am planning to use Redis as a cache and Postgresql as the DB

  • @sergeybayramov1466
    @sergeybayramov1466 2 года назад

    Is it possible and supported in current version to change formLogin to httpBasic?

  • @rakeshnukapeyyi5528
    @rakeshnukapeyyi5528 Год назад

    Where is the code challenge being maintained in the spring backend to validate against the code verifier? If it is in memory, it will cause an issue every time the server is restarted. The authenticated public client might use the non-existent code verifier.

    • @jofrantoba
      @jofrantoba Год назад

      public static void main(String[] args) throws NoSuchAlgorithmException {
      SpringApplication.run(Application.class, args);
      String codeVerifier=createCodeVerifier();
      log.info("code verifier:"+codeVerifier);
      log.info("code_challenge:"+createCodeChallenge(codeVerifier));
      }

      private static String createCodeChallenge(String value) throws NoSuchAlgorithmException {
      MessageDigest md = MessageDigest.getInstance("SHA-256");
      byte[] digest = md.digest(value.getBytes(StandardCharsets.US_ASCII));
      return Base64.getUrlEncoder().withoutPadding().encodeToString(digest);
      }

      private static String createCodeVerifier(){
      StringKeyGenerator secureKeyGenerator =
      new Base64StringKeyGenerator(Base64.getUrlEncoder().withoutPadding(), 96);
      return secureKeyGenerator.generateKey();
      }

  • @sadiulhakim7814
    @sadiulhakim7814 10 месяцев назад

    I am getting error while using BCryptPasswordEncoder instead of NoOpPasswordEncoder. It says Encoded password does not look like BCrypt.

    • @xxxHipHopRap
      @xxxHipHopRap 10 месяцев назад

      Did u fix it? I have the same problem but I want to use BCryptPasswordEncoder

    • @sadiulhakim7814
      @sadiulhakim7814 10 месяцев назад

      @@xxxHipHopRap no

    • @xxxHipHopRap
      @xxxHipHopRap 10 месяцев назад

      @@sadiulhakim7814 I fixed it doing this if u still need it:
      @Bean
      public RegisteredClientRepository registeredClientRepository() {
      BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
      RegisteredClient r1 = RegisteredClient.withId(UUID.randomUUID().toString())
      .clientId("myclient")
      .clientSecret(passwordEncoder.encode("secret"))........

  • @sabbirtanvir177
    @sabbirtanvir177 Год назад

    why I am getting this error ?
    Error creating bean with name 'securityFilterChainAs' defined in class path resource

    • @sabbirtanvir177
      @sabbirtanvir177 Год назад

      it is actually the Noclassdef error for OAuth2AuthorizationServerConfiguration , anyone to help?

    • @sabbirtanvir177
      @sabbirtanvir177 Год назад

      ok, spring changes the version, oauth2-server 0.3.0 will not work with spring 3.0.0, I needed to change ti to 1.0.1 version. I don't know what will spring do tomorrow. :)
      Now i follow all steps, but found a response invalid_request. Huuh, i don't know about this error at all.

  • @nico-s29
    @nico-s29 2 года назад

    Helped me a lot thank you

  • @yuyeyang4973
    @yuyeyang4973 2 года назад

    Is this the norm in actual development?

  • @yuyeyang4973
    @yuyeyang4973 2 года назад

    Can this example be used in actual development? A friend of mine said that this example has drawbacks. After the server restarts, everyone will be disconnected. Is that true?

    • @nick_bezverkhyi
      @nick_bezverkhyi 2 года назад +2

      It can't be used, for the actual development you would probably want to use db instead of in-memory solution

    • @nick_bezverkhyi
      @nick_bezverkhyi 2 года назад +1

      @Rendell Jay Eyas no, but should be pretty easy, just read the documentation

    • @khajalieubarrie5088
      @khajalieubarrie5088 2 года назад

      @Rendell Jay Eyas Check the speakers channel. Has an ongoing playlist on the subject

  • @jafajarvis324
    @jafajarvis324 2 года назад +1

    can anyone tell me how can i generate my own code chanllenge

    • @jafajarvis324
      @jafajarvis324 Год назад

      I got answer. Its totally pkce. We can get it from online and generate our own pkce code

    • @nihmathaafiya9693
      @nihmathaafiya9693 Год назад

      @@jafajarvis324 Hey, could you clarify how? It'll be really helpful, thanks

    • @jofrantoba
      @jofrantoba Год назад

      public static void main(String[] args) throws NoSuchAlgorithmException {
      SpringApplication.run(Application.class, args);
      String codeVerifier=createCodeVerifier();
      log.info("code verifier:"+codeVerifier);
      log.info("code_challenge:"+createCodeChallenge(codeVerifier));
      }

      private static String createCodeChallenge(String value) throws NoSuchAlgorithmException {
      MessageDigest md = MessageDigest.getInstance("SHA-256");
      byte[] digest = md.digest(value.getBytes(StandardCharsets.US_ASCII));
      return Base64.getUrlEncoder().withoutPadding().encodeToString(digest);
      }

      private static String createCodeVerifier(){
      StringKeyGenerator secureKeyGenerator =
      new Base64StringKeyGenerator(Base64.getUrlEncoder().withoutPadding(), 96);
      return secureKeyGenerator.generateKey();
      }

  • @AnkitKumar-ow6fg
    @AnkitKumar-ow6fg Год назад

    I loved the part where he mentioned about Log4J XD

  • @farjallahhaythem5675
    @farjallahhaythem5675 2 года назад

    the best

  • @dawidd6356
    @dawidd6356 2 года назад +3

    Dude speaks like a MACHINE (nvm i had it on 1.25x)

  • @felipebedoyacastano8434
    @felipebedoyacastano8434 2 года назад

    Thanks!

  • @arturolucas776
    @arturolucas776 2 года назад

    amazing

  • @mukendiemmanuel5640
    @mukendiemmanuel5640 2 года назад +1

    i do the same configuration but when i try to get access token on /oauth2/token it return 404 not found exception

    • @kiranjawale8822
      @kiranjawale8822 2 года назад

      Your issue resolved ?

    • @mukendiemmanuel5640
      @mukendiemmanuel5640 2 года назад

      @@kiranjawale8822 yes the problem was in query params and the Authorization header

  • @gopal2598
    @gopal2598 2 года назад

    In 0.3.0 version is it supporting password grant ?