{"id":82019,"date":"2024-10-31T03:04:15","date_gmt":"2024-10-30T23:34:15","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/"},"modified":"2024-10-31T03:04:15","modified_gmt":"2024-10-30T23:34:15","slug":"implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/","title":{"rendered":"\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc OAuth2 \u062f\u0631 Spring Boot: \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang <\/p>\n<p>  \u0627\u0633\u062a\u0627\u062f OAuth2 \u062f\u0631 Spring Boot \u0628\u0627 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645 \u0645\u0627! \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0645\u062b\u0627\u0644 \u0647\u0627\u06cc \u06a9\u062f \u0639\u0645\u0644\u06cc \u0627\u06cc\u0645\u0646 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u062f\u0631 \u0686\u0634\u0645 \u0627\u0646\u062f\u0627\u0632 \u062f\u06cc\u062c\u06cc\u062a\u0627\u0644\u06cc \u0628\u0647 \u0647\u0645 \u067e\u06cc\u0648\u0633\u062a\u0647 \u0627\u0645\u0631\u0648\u0632\u06cc\u060c \u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a. \u06cc\u06a9\u06cc \u0627\u0632 \u0642\u0648\u06cc \u062a\u0631\u06cc\u0646 \u0648 \u06af\u0633\u062a\u0631\u062f\u0647 \u062a\u0631\u06cc\u0646 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0647\u0627 \u0628\u0631\u0627\u06cc \u0645\u062c\u0648\u0632\u060c OAuth2 \u0627\u0633\u062a. \u0686\u0647 \u062f\u0631 \u062d\u0627\u0644 \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0644\u0641\u0646 \u0647\u0645\u0631\u0627\u0647 \u06cc\u0627 \u0647\u0631 \u0633\u0631\u0648\u06cc\u0633\u06cc \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0628\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f\u060c \u062f\u0631\u06a9 OAuth2 \u0636\u0631\u0648\u0631\u06cc \u0627\u0633\u062a.<\/p>\n<p>\u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc OAuth2 \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Spring Boot \u0628\u0627 \u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u0631\u0648\u06cc \u0622\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f authorization_code \u0646\u0648\u0639 \u06a9\u0645\u06a9 \u0645\u0627\u0644\u06cc \u0645\u0627 \u0645\u0641\u0627\u0647\u06cc\u0645 \u0631\u0627 \u062a\u062c\u0632\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0686\u0631\u0627 OAuth2 \u0645\u0647\u0645 \u0627\u0633\u062a\u060c \u0648 \u0645\u062b\u0627\u0644\u200c\u0647\u0627\u06cc \u06a9\u062f \u062c\u0627\u0648\u0627 \u0648\u0627\u0636\u062d\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0628\u0647 \u0634\u0645\u0627 \u062f\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u06a9\u0645\u06a9 \u06a9\u0646\u062f\u060c \u062d\u062a\u06cc \u0627\u06af\u0631 \u0645\u0628\u062a\u062f\u06cc \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<p>  OAuth2 \u0686\u06cc\u0633\u062a \u0648 \u0686\u0631\u0627 \u0645\u0647\u0645 \u0627\u0633\u062a\u061f<\/p>\n<p>OAuth2 (Open Authorization 2) \u06cc\u06a9 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0635\u0646\u0639\u062a\u06cc \u0628\u0631\u0627\u06cc \u0645\u062c\u0648\u0632 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u062d\u062f\u0648\u062f\u06cc \u0628\u0647 \u062d\u0633\u0627\u0628 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u06cc \u062f\u0631 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 HTTP\u060c \u0645\u0627\u0646\u0646\u062f \u0641\u06cc\u0633 \u0628\u0648\u06a9\u060c \u06af\u06cc\u062a \u0647\u0627\u0628\u060c \u06cc\u0627 \u06af\u0648\u06af\u0644\u060c \u0628\u062f\u0648\u0646 \u0627\u0641\u0634\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f.<\/p>\n<p>  \u0645\u0632\u0627\u06cc\u0627\u06cc \u06a9\u0644\u06cc\u062f\u06cc OAuth2:<\/p>\n<p>\u0627\u0645\u0646\u06cc\u062a: OAuth2 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0647\u0631\u06af\u0632 \u0628\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0634\u062e\u0635 \u062b\u0627\u0644\u062b \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0634\u062a\u0647 \u0646\u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631\u06cc: \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u062e\u062a\u0644\u0641 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0627\u0646\u0648\u0627\u0639 \u0645\u062e\u062a\u0644\u0641 \u06a9\u0645\u06a9 \u0647\u0632\u06cc\u0646\u0647 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631\u06cc: \u0645\u0646\u0627\u0633\u0628 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u062f\u0631 \u0647\u0631 \u0627\u0646\u062f\u0627\u0632\u0647\u060c \u0627\u0632 \u0627\u0633\u062a\u0627\u0631\u062a\u0627\u067e \u0647\u0627\u06cc \u06a9\u0648\u0686\u06a9 \u06af\u0631\u0641\u062a\u0647 \u062a\u0627 \u0634\u0631\u06a9\u062a \u0647\u0627\u06cc \u0628\u0632\u0631\u06af.<\/p>\n<p>\u062f\u0631\u06a9 OAuth2 \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646\u06cc \u06a9\u0647 \u0642\u0635\u062f \u062f\u0627\u0631\u0646\u062f \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 \u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u0646 \u0648 \u06a9\u0627\u0631\u0622\u0645\u062f \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0646\u062f\u060c \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<p>  \u0627\u0646\u0648\u0627\u0639 \u06a9\u0645\u06a9 \u0647\u0632\u06cc\u0646\u0647 OAuth2<\/p>\n<p>OAuth2 \u0686\u0646\u062f\u06cc\u0646 \u0646\u0648\u0639 \u06a9\u0645\u06a9 \u0645\u0627\u0644\u06cc \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0628\u0631\u0627\u06cc \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0645\u0646\u0627\u0633\u0628 \u0647\u0633\u062a\u0646\u062f:<\/p>\n<p>\u06a9\u062f \u0645\u062c\u0648\u0632: \u0645\u0646\u0627\u0633\u0628 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0633\u0645\u062a \u0633\u0631\u0648\u0631. \u0627\u06cc\u0646 \u0634\u0627\u0645\u0644 \u062a\u0628\u0627\u062f\u0644 \u06a9\u062f \u0645\u062c\u0648\u0632 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0646\u0634\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a.<\/p>\n<p>\u0636\u0645\u0646\u06cc: \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0633\u0645\u062a \u0645\u0634\u062a\u0631\u06cc \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u062a\u0648\u06a9\u0646 \u0647\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0628\u062f\u0648\u0646 \u06a9\u062f \u0645\u06cc\u0627\u0646\u06cc \u0628\u0627\u0632\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f.<\/p>\n<p>\u0627\u0639\u062a\u0628\u0627\u0631 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0645\u0627\u0644\u06a9 \u0645\u0646\u0628\u0639: \u0627\u0645\u06a9\u0627\u0646 \u0645\u0628\u0627\u062f\u0644\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0628\u0631\u0627\u06cc \u062a\u0648\u06a9\u0646 \u0647\u0627 \u0631\u0627 \u0645\u06cc \u062f\u0647\u062f. \u0628\u0647 \u0637\u0648\u0631 \u0645\u0639\u0645\u0648\u0644 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0627\u0639\u062a\u0628\u0627\u0631 \u0645\u0634\u062a\u0631\u06cc: \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u0627\u0634\u06cc\u0646 \u0628\u0647 \u0645\u0627\u0634\u06cc\u0646 \u0628\u062f\u0648\u0646 \u062f\u062e\u0627\u0644\u062a \u06a9\u0627\u0631\u0628\u0631.<\/p>\n<p>\u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 OAuth2 \u0627\u0632 \u0686\u0646\u062f\u06cc\u0646 \u0646\u0648\u0639 \u06a9\u0645\u06a9 \u0645\u0627\u0644\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0628\u0631 \u0631\u0648\u06cc \u0622\u0646 \u062a\u0645\u0631\u06a9\u0632 \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f \u06a9\u062f \u0645\u062c\u0648\u0632 \u0646\u0648\u0639 \u06af\u0631\u0646\u062a \u06a9\u0647 \u0627\u06cc\u0645\u0646 \u062a\u0631\u06cc\u0646 \u0648 \u067e\u0631\u06a9\u0627\u0631\u0628\u0631\u062f\u062a\u0631\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062a\u062d\u062a \u0648\u0628 \u0627\u0633\u062a.<\/p>\n<p>  \u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 OAuth2 \u062f\u0631 Spring Boot<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc OAuth2 \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Spring Boot \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645 authorization_code \u0646\u0648\u0639 \u06a9\u0645\u06a9 \u0645\u0627\u0644\u06cc<\/p>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/p>\n<p>\u06a9\u06cc\u062a \u062a\u0648\u0633\u0639\u0647 \u062c\u0627\u0648\u0627 (JDK) 11 \u06cc\u0627 \u0628\u0627\u0644\u0627\u062a\u0631<br \/>\nSpring Boot 2.7+<br \/>\n\u0627\u0628\u0632\u0627\u0631 \u0633\u0627\u062e\u062a Maven \u06cc\u0627 Gradle<\/p>\n<p>\u06cc\u06a9 \u062d\u0633\u0627\u0628 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 OAuth2 (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c Google\u060c GitHub)<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647 \u0628\u0648\u062a \u0628\u0647\u0627\u0631<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Spring Boot \u062c\u062f\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Spring Initializr \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\u067e\u0631\u0648\u0698\u0647: \u067e\u0631\u0648\u0698\u0647 Maven<\/p>\n<p>\u0632\u0628\u0627\u0646: \u062c\u0627\u0648\u0627<\/p>\n<p>\u0686\u06a9\u0645\u0647 \u0628\u0647\u0627\u0631\u0647: 2.7.x \u06cc\u0627 \u0628\u0627\u0644\u0627\u062a\u0631<\/p>\n<p>\u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627:<\/p>\n<p>\u0648\u0628 \u0628\u0647\u0627\u0631<br \/>\n\u0627\u0645\u0646\u06cc\u062a \u0628\u0647\u0627\u0631<br \/>\n\u0645\u0634\u062a\u0631\u06cc OAuth2<br \/>\n\u0628\u0631\u06af \u0622\u0648\u06cc\u0634\u0646 (\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc\u060c \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0631\u0646\u062f\u0631)<\/p>\n<p>\u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0631\u062f\u0647 \u0648 \u062f\u0631 IDE \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 2: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc OAuth2 Client<\/p>\n<p>\u062f\u0631 \u0634\u0645\u0627 application.properties \u06cc\u0627 application.yml\u060c \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0645\u0634\u062a\u0631\u06cc OAuth2 \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Google \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 OAuth2 \u0622\u0648\u0631\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p>spring:<br \/>\n  security:<br \/>\n    oauth2:<br \/>\n      client:<br \/>\n        registration:<br \/>\n          google:<br \/>\n            client-id: YOUR_GOOGLE_CLIENT_ID<br \/>\n            client-secret: YOUR_GOOGLE_CLIENT_SECRET<br \/>\n            scope: profile, email<br \/>\n        provider:<br \/>\n          google:<br \/>\n            authorization-uri: https:\/\/accounts.google.com\/o\/oauth2\/v2\/auth<br \/>\n            token-uri: https:\/\/www.googleapis.com\/oauth2\/v4\/token<br \/>\n            user-info-uri: https:\/\/www.googleapis.com\/oauth2\/v3\/userinfo<br \/>\n            user-name-attribute: sub<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f: \u062a\u0639\u0648\u06cc\u0636 \u06a9\u0646\u06cc\u062f YOUR_GOOGLE_CLIENT_ID \u0648 YOUR_GOOGLE_CLIENT_SECRET \u0628\u0627 \u0627\u0639\u062a\u0628\u0627\u0631 \u0648\u0627\u0642\u0639\u06cc \u062e\u0648\u062f \u0627\u0632 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 OAuth2.<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u0627\u06cc\u062c\u0627\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc<\/p>\n<p>\u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0645\u0646\u06cc\u062a\u06cc \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 OAuth2 \u0648 \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc \u062e\u0648\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<p>package com.example.oauth2demo.config;<\/p>\n<p>import org.springframework.context.annotation.Bean;<br \/>\nimport org.springframework.context.annotation.Configuration;<br \/>\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;<br \/>\nimport org.springframework.security.web.SecurityFilterChain;<br \/>\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;<\/p>\n<p>@Configuration<br \/>\n@EnableWebSecurity<br \/>\npublic class SecurityConfig {<\/p>\n<p>    @Bean<br \/>\n    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {<br \/>\n        http<br \/>\n            .authorizeRequests(authorize -&gt; authorize<br \/>\n                .antMatchers(&#8220;https:\/\/dev.to\/&#8221;, &#8220;\/login&#8221;).permitAll()<br \/>\n                .anyRequest().authenticated()<br \/>\n            )<br \/>\n            .oauth2Login(oauth2 -&gt; oauth2<br \/>\n                .loginPage(&#8220;\/login&#8221;)<br \/>\n                .defaultSuccessURL(&#8220;\/home&#8221;, true)<br \/>\n            );<br \/>\n        return http.build();<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 4: \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627<\/p>\n<p>\u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0647\u0627\u06cc\u06cc \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0635\u0641\u062d\u0647 \u0641\u0631\u0648\u062f\u060c \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0648 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<p>package com.example.oauth2demo.controller;<\/p>\n<p>import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;<br \/>\nimport org.springframework.stereotype.Controller;<br \/>\nimport org.springframework.ui.Model;<br \/>\nimport org.springframework.web.bind.annotation.GetMapping;<\/p>\n<p>@Controller<br \/>\npublic class MainController {<\/p>\n<p>    @GetMapping(&#8220;https:\/\/dev.to\/&#8221;)<br \/>\n    public String index() {<br \/>\n        return &#8220;index&#8221;; \/\/ Return index.html<br \/>\n    }<\/p>\n<p>    @GetMapping(&#8220;\/login&#8221;)<br \/>\n    public String login() {<br \/>\n        return &#8220;login&#8221;; \/\/ Return login.html<br \/>\n    }<\/p>\n<p>    @GetMapping(&#8220;\/home&#8221;)<br \/>\n    public String home(OAuth2AuthenticationToken authentication, Model model) {<br \/>\n        model.addAttribute(&#8220;user&#8221;, authentication.getPrincipal().getAttributes());<br \/>\n        return &#8220;home&#8221;; \/\/ Return home.html<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 5: \u0627\u06cc\u062c\u0627\u062f Views<\/p>\n<p>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Thymeleaf\u060c \u0642\u0627\u0644\u0628 \u0647\u0627\u06cc \u0633\u0627\u062f\u0647 HTML \u0628\u0631\u0627\u06cc \u0622\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f index.html\u060c login.html\u060c \u0648 home.html.<\/p>\n<p>index.html<\/p>\n<p>login.html<\/p>\n<p>home.html<\/p>\n<p> xmlns:th=&#8221;http:\/\/www.thymeleaf.org&#8221;&gt;<\/p>\n<p>    Home<\/p>\n<p>    Home<br \/>\n    Welcome,  th:text=&#8221;${user[&#8216;name&#8217;]}&#8221;&gt;!<br \/>\n    Email:  th:text=&#8221;${user[&#8217;email&#8217;]}&#8221;&gt;<br \/>\n     href=&#8221;\/logout&#8221;&gt;Logout<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 6: \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647<\/p>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 Spring Boot \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f. \u062d\u0631\u06a9\u062a \u0628\u0647 http:\/\/localhost:8080\/ \u0648 \u0631\u0648\u06cc \u067e\u06cc\u0648\u0646\u062f &#8220;\u0648\u0631\u0648\u062f \u0628\u0627 \u06af\u0648\u06af\u0644&#8221; \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f. \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0628\u0647 \u0635\u0641\u062d\u0647 \u0631\u0636\u0627\u06cc\u062a OAuth2 Google \u0647\u062f\u0627\u06cc\u062a \u0634\u0648\u06cc\u062f. \u067e\u0633 \u0627\u0632 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632\u060c \u0628\u0647 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0647\u062f\u0627\u06cc\u062a \u0645\u06cc \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u062e\u0648\u062f \u0631\u0627 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>  \u062a\u0642\u0648\u06cc\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646<\/p>\n<p>  \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0645\u062e\u062a\u0644\u0641 OAuth2<\/p>\n<p>\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0686\u0646\u062f\u06cc\u0646 \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u0647 OAuth2 \u0631\u0627 \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0622\u0646\u0647\u0627 \u0628\u0647 \u062e\u0648\u062f \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f application.yml \u06cc\u0627 application.properties. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u0628\u0631\u0627\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 GitHub:<\/p>\n<p>spring:<br \/>\n  security:<br \/>\n    oauth2:<br \/>\n      client:<br \/>\n        registration:<br \/>\n          github:<br \/>\n            client-id: YOUR_GITHUB_CLIENT_ID<br \/>\n            client-secret: YOUR_GITHUB_CLIENT_SECRET<br \/>\n            scope: read:user<br \/>\n        provider:<br \/>\n          github:<br \/>\n            authorization-uri: https:\/\/github.com\/login\/oauth\/authorize<br \/>\n            token-uri: https:\/\/github.com\/login\/oauth\/access_token<br \/>\n            user-info-uri: https:\/\/api.github.com\/user<br \/>\n            user-name-attribute: id<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0631\u062f\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631<\/p>\n<p>\u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0646\u062d\u0648\u0647 \u067e\u0631\u062f\u0627\u0632\u0634 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0627 \u0627\u062c\u0631\u0627\u06cc \u06cc\u06a9 \u0633\u0641\u0627\u0631\u0634\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0646\u06cc\u062f OAuth2UserService.<\/p>\n<p>package com.example.oauth2demo.service;<\/p>\n<p>import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;<br \/>\nimport org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;<br \/>\nimport org.springframework.security.oauth2.core.OAuth2AuthenticationException;<br \/>\nimport org.springframework.security.oauth2.core.user.OAuth2User;<br \/>\nimport org.springframework.stereotype.Service;<\/p>\n<p>@Service<br \/>\npublic class CustomOAuth2UserService extends DefaultOAuth2UserService {<\/p>\n<p>    @Override<br \/>\n    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {<br \/>\n        OAuth2User user = super.loadUser(userRequest);<br \/>\n        \/\/ Add custom processing here<br \/>\n        return user;<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0633\u067e\u0633\u060c \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f SecurityConfig \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0633\u0631\u0648\u06cc\u0633 \u06a9\u0627\u0631\u0628\u0631 \u0633\u0641\u0627\u0631\u0634\u06cc:<\/p>\n<p>.oauth2Login(oauth2 -&gt; oauth2<br \/>\n    .userInfoEndpoint(userInfo -&gt; userInfo<br \/>\n        .userService(customOAuth2UserService)<br \/>\n    )<br \/>\n    .loginPage(&#8220;\/login&#8221;)<br \/>\n    .defaultSuccessURL(&#8220;\/home&#8221;, true)<br \/>\n)<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/p>\n<p>\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc OAuth2 \u062f\u0631 Spring Boot \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 authorization_code \u0646\u0648\u0639 \u06af\u0631\u0627\u0646\u062a \u0631\u0648\u0634\u06cc \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0628\u0631\u0627\u06cc \u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0634\u0645\u0627 \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u0648\u062b\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0627\u0633\u062a. \u0628\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f OAuth2 \u0631\u0627 \u0628\u0627 \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0645\u062d\u0628\u0648\u0628\u06cc \u0645\u0627\u0646\u0646\u062f Google \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0645\u062a\u0646\u0627\u0633\u0628 \u0628\u0627 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u062e\u0627\u0635 \u062e\u0648\u062f \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0628\u0627 OAuth2 \u0631\u0627\u062d\u062a\u200c\u062a\u0631 \u0645\u06cc\u200c\u0634\u0648\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0646\u0648\u0627\u0639 \u062f\u06cc\u06af\u0631 \u06a9\u0645\u06a9 \u0645\u0627\u0644\u06cc \u0648 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc\u200c\u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647\u200c\u062a\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0627\u06cc\u0634 \u0627\u0645\u0646\u06cc\u062a \u0648 \u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u06a9\u0627\u0648\u0634 \u06a9\u0646\u06cc\u062f. \u06a9\u062f \u0646\u0648\u06cc\u0633\u06cc \u0645\u0628\u0627\u0631\u06a9!<\/p>\n<p>  \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0648\u0635\u0644 \u0634\u0648\u06cc\u0645!<\/p>\n<p>\ud83d\udce7 \u06cc\u06a9 \u067e\u0633\u062a \u0631\u0627 \u0627\u0632 \u062f\u0633\u062a \u0646\u062f\u0647\u06cc\u062f! \u0645\u0634\u062a\u0631\u06a9 \u0634\u062f\u0646 \u062f\u0631 \u062e\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0646!\u27a1\ufe0f \u0644\u06cc\u0646\u06a9\u062f\u06cc\u0646\ud83d\udea9 \u067e\u0633\u062a \u0627\u0635\u0644\u06cc\u2615 \u0628\u0631\u0627\u06cc \u0645\u0646 \u06cc\u06a9 \u0642\u0647\u0648\u0647 \u0628\u062e\u0631<\/p>\n<div data-article-id=\"2067704\" id=\"article-body\">\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D8%A7%D8%B3%D8%AA%D8%A7%D8%AF_OAuth2_%D8%AF%D8%B1_Spring_Boot_%D8%A8%D8%A7_%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C_%DA%AF%D8%A7%D9%85_%D8%A8%D9%87_%DA%AF%D8%A7%D9%85_%D9%85%D8%A7_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D9%87%D8%A7%DB%8C_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A8%D8%A7_%D9%85%D8%AB%D8%A7%D9%84_%D9%87%D8%A7%DB%8C_%DA%A9%D8%AF_%D8%B9%D9%85%D9%84%DB%8C_%D8%A7%DB%8C%D9%85%D9%86_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0627\u0633\u062a\u0627\u062f OAuth2 \u062f\u0631 Spring Boot \u0628\u0627 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645 \u0645\u0627! \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0645\u062b\u0627\u0644 \u0647\u0627\u06cc \u06a9\u062f \u0639\u0645\u0644\u06cc \u0627\u06cc\u0645\u0646 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#OAuth2_%DA%86%DB%8C%D8%B3%D8%AA_%D9%88_%DA%86%D8%B1%D8%A7_%D9%85%D9%87%D9%85_%D8%A7%D8%B3%D8%AA%D8%9F\" >OAuth2 \u0686\u06cc\u0633\u062a \u0648 \u0686\u0631\u0627 \u0645\u0647\u0645 \u0627\u0633\u062a\u061f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D9%85%D8%B2%D8%A7%DB%8C%D8%A7%DB%8C_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C_OAuth2\" >\u0645\u0632\u0627\u06cc\u0627\u06cc \u06a9\u0644\u06cc\u062f\u06cc OAuth2:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D8%A7%D9%86%D9%88%D8%A7%D8%B9_%DA%A9%D9%85%DA%A9_%D9%87%D8%B2%DB%8C%D9%86%D9%87_OAuth2\" >\u0627\u0646\u0648\u0627\u0639 \u06a9\u0645\u06a9 \u0647\u0632\u06cc\u0646\u0647 OAuth2<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D8%B4%D8%B1%D9%88%D8%B9_%DA%A9%D8%A7%D8%B1_%D8%A8%D8%A7_OAuth2_%D8%AF%D8%B1_Spring_Boot\" >\u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 OAuth2 \u062f\u0631 Spring Boot<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\" >\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%A8%D9%88%D8%AA_%D8%A8%D9%87%D8%A7%D8%B1\" >\u0645\u0631\u062d\u0644\u0647 1: \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647 \u0628\u0648\u062a \u0628\u0647\u0627\u0631<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_OAuth2_Client\" >\u0645\u0631\u062d\u0644\u0647 2: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc OAuth2 Client<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D8%AA%D9%86%D8%B8%DB%8C%D9%85%D8%A7%D8%AA_%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C\" >\u0645\u0631\u062d\u0644\u0647 3: \u0627\u06cc\u062c\u0627\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1%D9%87%D8%A7\" >\u0645\u0631\u062d\u0644\u0647 4: \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_5_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_Views\" >\u0645\u0631\u062d\u0644\u0647 5: \u0627\u06cc\u062c\u0627\u062f Views<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_6_%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87\" >\u0645\u0631\u062d\u0644\u0647 6: \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D8%AA%D9%82%D9%88%DB%8C%D8%AA_%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86\" >\u062a\u0642\u0648\u06cc\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA_%D8%A7%D8%B1%D8%A7%D8%A6%D9%87_%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86_%D9%85%D8%AE%D8%AA%D9%84%D9%81_OAuth2\" >\u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0645\u062e\u062a\u0644\u0641 OAuth2<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C_%DA%A9%D8%B1%D8%AF%D9%86_%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\" >\u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0631\u062f\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/nabfollower.com\/blog\/implementing-oauth2-in-spring-boot-a-step-by-step-guide-5a5h\/#%D8%A8%DB%8C%D8%A7%DB%8C%DB%8C%D8%AF_%D9%88%D8%B5%D9%84_%D8%B4%D9%88%DB%8C%D9%85\" >\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0648\u0635\u0644 \u0634\u0648\u06cc\u0645!<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B3%D8%AA%D8%A7%D8%AF_OAuth2_%D8%AF%D8%B1_Spring_Boot_%D8%A8%D8%A7_%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C_%DA%AF%D8%A7%D9%85_%D8%A8%D9%87_%DA%AF%D8%A7%D9%85_%D9%85%D8%A7_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D9%87%D8%A7%DB%8C_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A8%D8%A7_%D9%85%D8%AB%D8%A7%D9%84_%D9%87%D8%A7%DB%8C_%DA%A9%D8%AF_%D8%B9%D9%85%D9%84%DB%8C_%D8%A7%DB%8C%D9%85%D9%86_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0627\u0633\u062a\u0627\u062f OAuth2 \u062f\u0631 Spring Boot \u0628\u0627 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645 \u0645\u0627! \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0645\u062b\u0627\u0644 \u0647\u0627\u06cc \u06a9\u062f \u0639\u0645\u0644\u06cc \u0627\u06cc\u0645\u0646 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0686\u0634\u0645 \u0627\u0646\u062f\u0627\u0632 \u062f\u06cc\u062c\u06cc\u062a\u0627\u0644\u06cc \u0628\u0647 \u0647\u0645 \u067e\u06cc\u0648\u0633\u062a\u0647 \u0627\u0645\u0631\u0648\u0632\u06cc\u060c \u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a. \u06cc\u06a9\u06cc \u0627\u0632 \u0642\u0648\u06cc \u062a\u0631\u06cc\u0646 \u0648 \u06af\u0633\u062a\u0631\u062f\u0647 \u062a\u0631\u06cc\u0646 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0647\u0627 \u0628\u0631\u0627\u06cc \u0645\u062c\u0648\u0632\u060c OAuth2 \u0627\u0633\u062a. \u0686\u0647 \u062f\u0631 \u062d\u0627\u0644 \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0644\u0641\u0646 \u0647\u0645\u0631\u0627\u0647 \u06cc\u0627 \u0647\u0631 \u0633\u0631\u0648\u06cc\u0633\u06cc \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0628\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f\u060c \u062f\u0631\u06a9 OAuth2 \u0636\u0631\u0648\u0631\u06cc \u0627\u0633\u062a.<\/p>\n<p>\u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc OAuth2 \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Spring Boot \u0628\u0627 \u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u0631\u0648\u06cc \u0622\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f <code>authorization_code<\/code> \u0646\u0648\u0639 \u06a9\u0645\u06a9 \u0645\u0627\u0644\u06cc \u0645\u0627 \u0645\u0641\u0627\u0647\u06cc\u0645 \u0631\u0627 \u062a\u062c\u0632\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0686\u0631\u0627 OAuth2 \u0645\u0647\u0645 \u0627\u0633\u062a\u060c \u0648 \u0645\u062b\u0627\u0644\u200c\u0647\u0627\u06cc \u06a9\u062f \u062c\u0627\u0648\u0627 \u0648\u0627\u0636\u062d\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0628\u0647 \u0634\u0645\u0627 \u062f\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u06a9\u0645\u06a9 \u06a9\u0646\u062f\u060c \u062d\u062a\u06cc \u0627\u06af\u0631 \u0645\u0628\u062a\u062f\u06cc \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"OAuth2_%DA%86%DB%8C%D8%B3%D8%AA_%D9%88_%DA%86%D8%B1%D8%A7_%D9%85%D9%87%D9%85_%D8%A7%D8%B3%D8%AA%D8%9F\"><\/span>\n<p>  OAuth2 \u0686\u06cc\u0633\u062a \u0648 \u0686\u0631\u0627 \u0645\u0647\u0645 \u0627\u0633\u062a\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>OAuth2 (Open Authorization 2) \u06cc\u06a9 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0635\u0646\u0639\u062a\u06cc \u0628\u0631\u0627\u06cc \u0645\u062c\u0648\u0632 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u062d\u062f\u0648\u062f\u06cc \u0628\u0647 \u062d\u0633\u0627\u0628 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u06cc \u062f\u0631 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 HTTP\u060c \u0645\u0627\u0646\u0646\u062f \u0641\u06cc\u0633 \u0628\u0648\u06a9\u060c \u06af\u06cc\u062a \u0647\u0627\u0628\u060c \u06cc\u0627 \u06af\u0648\u06af\u0644\u060c \u0628\u062f\u0648\u0646 \u0627\u0641\u0634\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B2%D8%A7%DB%8C%D8%A7%DB%8C_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C_OAuth2\"><\/span>\n<p>  \u0645\u0632\u0627\u06cc\u0627\u06cc \u06a9\u0644\u06cc\u062f\u06cc OAuth2:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol>\n<li>\n<strong>\u0627\u0645\u0646\u06cc\u062a<\/strong>: OAuth2 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0647\u0631\u06af\u0632 \u0628\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0634\u062e\u0635 \u062b\u0627\u0644\u062b \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0634\u062a\u0647 \u0646\u0645\u06cc \u0634\u0648\u062f.<\/li>\n<li>\n<strong>\u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631\u06cc<\/strong>: \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u062e\u062a\u0644\u0641 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0627\u0646\u0648\u0627\u0639 \u0645\u062e\u062a\u0644\u0641 \u06a9\u0645\u06a9 \u0647\u0632\u06cc\u0646\u0647 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<strong>\u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631\u06cc<\/strong>: \u0645\u0646\u0627\u0633\u0628 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u062f\u0631 \u0647\u0631 \u0627\u0646\u062f\u0627\u0632\u0647\u060c \u0627\u0632 \u0627\u0633\u062a\u0627\u0631\u062a\u0627\u067e \u0647\u0627\u06cc \u06a9\u0648\u0686\u06a9 \u06af\u0631\u0641\u062a\u0647 \u062a\u0627 \u0634\u0631\u06a9\u062a \u0647\u0627\u06cc \u0628\u0632\u0631\u06af.<\/li>\n<\/ol>\n<p>\u062f\u0631\u06a9 OAuth2 \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646\u06cc \u06a9\u0647 \u0642\u0635\u062f \u062f\u0627\u0631\u0646\u062f \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 \u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u0646 \u0648 \u06a9\u0627\u0631\u0622\u0645\u062f \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u0646\u062f\u060c \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D9%86%D9%88%D8%A7%D8%B9_%DA%A9%D9%85%DA%A9_%D9%87%D8%B2%DB%8C%D9%86%D9%87_OAuth2\"><\/span>\n<p>  \u0627\u0646\u0648\u0627\u0639 \u06a9\u0645\u06a9 \u0647\u0632\u06cc\u0646\u0647 OAuth2<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>OAuth2 \u0686\u0646\u062f\u06cc\u0646 \u0646\u0648\u0639 \u06a9\u0645\u06a9 \u0645\u0627\u0644\u06cc \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0628\u0631\u0627\u06cc \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0645\u0646\u0627\u0633\u0628 \u0647\u0633\u062a\u0646\u062f:<\/p>\n<ol>\n<li>\n<strong>\u06a9\u062f \u0645\u062c\u0648\u0632<\/strong>: \u0645\u0646\u0627\u0633\u0628 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0633\u0645\u062a \u0633\u0631\u0648\u0631. \u0627\u06cc\u0646 \u0634\u0627\u0645\u0644 \u062a\u0628\u0627\u062f\u0644 \u06a9\u062f \u0645\u062c\u0648\u0632 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0646\u0634\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a.<\/li>\n<li>\n<strong>\u0636\u0645\u0646\u06cc<\/strong>: \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0633\u0645\u062a \u0645\u0634\u062a\u0631\u06cc \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u062a\u0648\u06a9\u0646 \u0647\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0628\u062f\u0648\u0646 \u06a9\u062f \u0645\u06cc\u0627\u0646\u06cc \u0628\u0627\u0632\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f.<\/li>\n<li>\n<strong>\u0627\u0639\u062a\u0628\u0627\u0631 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0645\u0627\u0644\u06a9 \u0645\u0646\u0628\u0639<\/strong>: \u0627\u0645\u06a9\u0627\u0646 \u0645\u0628\u0627\u062f\u0644\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0628\u0631\u0627\u06cc \u062a\u0648\u06a9\u0646 \u0647\u0627 \u0631\u0627 \u0645\u06cc \u062f\u0647\u062f. \u0628\u0647 \u0637\u0648\u0631 \u0645\u0639\u0645\u0648\u0644 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/li>\n<li>\n<strong>\u0627\u0639\u062a\u0628\u0627\u0631 \u0645\u0634\u062a\u0631\u06cc<\/strong>: \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u0627\u0634\u06cc\u0646 \u0628\u0647 \u0645\u0627\u0634\u06cc\u0646 \u0628\u062f\u0648\u0646 \u062f\u062e\u0627\u0644\u062a \u06a9\u0627\u0631\u0628\u0631.<\/li>\n<\/ol>\n<p>\u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 OAuth2 \u0627\u0632 \u0686\u0646\u062f\u06cc\u0646 \u0646\u0648\u0639 \u06a9\u0645\u06a9 \u0645\u0627\u0644\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0628\u0631 \u0631\u0648\u06cc \u0622\u0646 \u062a\u0645\u0631\u06a9\u0632 \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f <strong>\u06a9\u062f \u0645\u062c\u0648\u0632<\/strong> \u0646\u0648\u0639 \u06af\u0631\u0646\u062a \u06a9\u0647 \u0627\u06cc\u0645\u0646 \u062a\u0631\u06cc\u0646 \u0648 \u067e\u0631\u06a9\u0627\u0631\u0628\u0631\u062f\u062a\u0631\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062a\u062d\u062a \u0648\u0628 \u0627\u0633\u062a.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B4%D8%B1%D9%88%D8%B9_%DA%A9%D8%A7%D8%B1_%D8%A8%D8%A7_OAuth2_%D8%AF%D8%B1_Spring_Boot\"><\/span>\n<p>  \u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 OAuth2 \u062f\u0631 Spring Boot<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc OAuth2 \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Spring Boot \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645 <code>authorization_code<\/code> \u0646\u0648\u0639 \u06a9\u0645\u06a9 \u0645\u0627\u0644\u06cc<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\"><\/span>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><strong>\u06a9\u06cc\u062a \u062a\u0648\u0633\u0639\u0647 \u062c\u0627\u0648\u0627 (JDK) 11 \u06cc\u0627 \u0628\u0627\u0644\u0627\u062a\u0631<\/strong><\/li>\n<li><strong>Spring Boot 2.7+<\/strong><\/li>\n<li><strong>\u0627\u0628\u0632\u0627\u0631 \u0633\u0627\u062e\u062a Maven \u06cc\u0627 Gradle<\/strong><\/li>\n<li>\n<strong>\u06cc\u06a9 \u062d\u0633\u0627\u0628 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 OAuth2<\/strong> (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c Google\u060c GitHub)<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%A8%D9%88%D8%AA_%D8%A8%D9%87%D8%A7%D8%B1\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647 \u0628\u0648\u062a \u0628\u0647\u0627\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Spring Boot \u062c\u062f\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Spring Initializr \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<ul>\n<li>\n<strong>\u067e\u0631\u0648\u0698\u0647<\/strong>: \u067e\u0631\u0648\u0698\u0647 Maven<\/li>\n<li>\n<strong>\u0632\u0628\u0627\u0646<\/strong>: \u062c\u0627\u0648\u0627<\/li>\n<li>\n<strong>\u0686\u06a9\u0645\u0647 \u0628\u0647\u0627\u0631\u0647<\/strong>: 2.7.x \u06cc\u0627 \u0628\u0627\u0644\u0627\u062a\u0631<\/li>\n<li>\n<strong>\u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627<\/strong>:<\/p>\n<ul>\n<li>\u0648\u0628 \u0628\u0647\u0627\u0631<\/li>\n<li>\u0627\u0645\u0646\u06cc\u062a \u0628\u0647\u0627\u0631<\/li>\n<li>\u0645\u0634\u062a\u0631\u06cc OAuth2<\/li>\n<li>\u0628\u0631\u06af \u0622\u0648\u06cc\u0634\u0646 (\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc\u060c \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0631\u0646\u062f\u0631)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0631\u062f\u0647 \u0648 \u062f\u0631 IDE \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_OAuth2_Client\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 2: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc OAuth2 Client<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 \u0634\u0645\u0627 <code>application.properties<\/code> \u06cc\u0627 <code>application.yml<\/code>\u060c \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0645\u0634\u062a\u0631\u06cc OAuth2 \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Google \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 OAuth2 \u0622\u0648\u0631\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">security<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">oauth2<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">client<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">registration<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">google<\/span><span class=\"pi\">:<\/span>\n            <span class=\"na\">client-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">YOUR_GOOGLE_CLIENT_ID<\/span>\n            <span class=\"na\">client-secret<\/span><span class=\"pi\">:<\/span> <span class=\"s\">YOUR_GOOGLE_CLIENT_SECRET<\/span>\n            <span class=\"na\">scope<\/span><span class=\"pi\">:<\/span> <span class=\"s\">profile, email<\/span>\n        <span class=\"na\">provider<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">google<\/span><span class=\"pi\">:<\/span>\n            <span class=\"na\">authorization-uri<\/span><span class=\"pi\">:<\/span> <span class=\"s\">https:\/\/accounts.google.com\/o\/oauth2\/v2\/auth<\/span>\n            <span class=\"na\">token-uri<\/span><span class=\"pi\">:<\/span> <span class=\"s\">https:\/\/www.googleapis.com\/oauth2\/v4\/token<\/span>\n            <span class=\"na\">user-info-uri<\/span><span class=\"pi\">:<\/span> <span class=\"s\">https:\/\/www.googleapis.com\/oauth2\/v3\/userinfo<\/span>\n            <span class=\"na\">user-name-attribute<\/span><span class=\"pi\">:<\/span> <span class=\"s\">sub<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f<\/strong>: \u062a\u0639\u0648\u06cc\u0636 \u06a9\u0646\u06cc\u062f <code>YOUR_GOOGLE_CLIENT_ID<\/code> \u0648 <code>YOUR_GOOGLE_CLIENT_SECRET<\/code> \u0628\u0627 \u0627\u0639\u062a\u0628\u0627\u0631 \u0648\u0627\u0642\u0639\u06cc \u062e\u0648\u062f \u0627\u0632 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 OAuth2.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D8%AA%D9%86%D8%B8%DB%8C%D9%85%D8%A7%D8%AA_%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u0627\u06cc\u062c\u0627\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0627\u0645\u0646\u06cc\u062a\u06cc \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 OAuth2 \u0648 \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc \u062e\u0648\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.oauth2demo.config<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Bean<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Configuration<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.config.annotation.web.builders.HttpSecurity<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.web.SecurityFilterChain<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.config.annotation.web.configuration.EnableWebSecurity<\/span><span class=\"o\">;<\/span>\n\n<span class=\"nd\">@Configuration<\/span>\n<span class=\"nd\">@EnableWebSecurity<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">SecurityConfig<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"nd\">@Bean<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nc\">SecurityFilterChain<\/span> <span class=\"nf\">securityFilterChain<\/span><span class=\"o\">(<\/span><span class=\"nc\">HttpSecurity<\/span> <span class=\"n\">http<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">http<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">authorizeRequests<\/span><span class=\"o\">(<\/span><span class=\"n\">authorize<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">authorize<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">antMatchers<\/span><span class=\"o\">(<\/span><span class=\"s\">\"https:\/\/dev.to\/\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"\/login\"<\/span><span class=\"o\">).<\/span><span class=\"na\">permitAll<\/span><span class=\"o\">()<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">anyRequest<\/span><span class=\"o\">().<\/span><span class=\"na\">authenticated<\/span><span class=\"o\">()<\/span>\n            <span class=\"o\">)<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">oauth2Login<\/span><span class=\"o\">(<\/span><span class=\"n\">oauth2<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">oauth2<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">loginPage<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/login\"<\/span><span class=\"o\">)<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">defaultSuccessURL<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/home\"<\/span><span class=\"o\">,<\/span> <span class=\"kc\">true<\/span><span class=\"o\">)<\/span>\n            <span class=\"o\">);<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"na\">build<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1%D9%87%D8%A7\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 4: \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0647\u0627\u06cc\u06cc \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0635\u0641\u062d\u0647 \u0641\u0631\u0648\u062f\u060c \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0648 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.oauth2demo.controller<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.stereotype.Controller<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.ui.Model<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.GetMapping<\/span><span class=\"o\">;<\/span>\n\n<span class=\"nd\">@Controller<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MainController<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"nd\">@GetMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"https:\/\/dev.to\/\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">index<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"s\">\"index\"<\/span><span class=\"o\">;<\/span> <span class=\"c1\">\/\/ Return index.html<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@GetMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/login\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">login<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"s\">\"login\"<\/span><span class=\"o\">;<\/span> <span class=\"c1\">\/\/ Return login.html<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"nd\">@GetMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/home\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">home<\/span><span class=\"o\">(<\/span><span class=\"nc\">OAuth2AuthenticationToken<\/span> <span class=\"n\">authentication<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Model<\/span> <span class=\"n\">model<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"na\">addAttribute<\/span><span class=\"o\">(<\/span><span class=\"s\">\"user\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">authentication<\/span><span class=\"o\">.<\/span><span class=\"na\">getPrincipal<\/span><span class=\"o\">().<\/span><span class=\"na\">getAttributes<\/span><span class=\"o\">());<\/span>\n        <span class=\"k\">return<\/span> <span class=\"s\">\"home\"<\/span><span class=\"o\">;<\/span> <span class=\"c1\">\/\/ Return home.html<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_5_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_Views\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 5: \u0627\u06cc\u062c\u0627\u062f Views<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Thymeleaf\u060c \u0642\u0627\u0644\u0628 \u0647\u0627\u06cc \u0633\u0627\u062f\u0647 HTML \u0628\u0631\u0627\u06cc \u0622\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>index.html<\/code>\u060c <code>login.html<\/code>\u060c \u0648 <code>home.html<\/code>.<\/p>\n<p><strong>index.html<\/strong><\/p>\n<p><strong>login.html<\/strong><\/p>\n<p><strong>home.html<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight html\"><code><span class=\"cp\"\/>\n<span class=\"nt\"> <span class=\"na\">xmlns:th=<\/span><span class=\"s\">\"http:\/\/www.thymeleaf.org\"<\/span><span class=\"nt\">&gt;<\/span>\n<span class=\"nt\"\/>\n    <span class=\"nt\"><title\/><\/span>Home<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n    <span class=\"nt\"\/>Home<span class=\"nt\"\/>\n    <span class=\"nt\"\/>Welcome, <span class=\"nt\"><span> <span class=\"na\">th:text=<\/span><span class=\"s\">\"${user['name']}\"<\/span><span class=\"nt\">&gt;<\/span><\/span>!<span class=\"nt\"\/>\n    <span class=\"nt\"\/>Email: <span class=\"nt\"><span> <span class=\"na\">th:text=<\/span><span class=\"s\">\"${user['email']}\"<\/span><span class=\"nt\">&gt;<\/span><\/span>\n    <span class=\"nt\"><a> <span class=\"na\">href=<\/span><span class=\"s\">\"\/logout\"<\/span><span class=\"nt\">&gt;<\/span>Logout<span class=\"nt\"\/><\/span>\n<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n<\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_6_%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 6: \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 Spring Boot \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f. \u062d\u0631\u06a9\u062a \u0628\u0647 <code>http:\/\/localhost:8080\/<\/code> \u0648 \u0631\u0648\u06cc \u067e\u06cc\u0648\u0646\u062f &#8220;\u0648\u0631\u0648\u062f \u0628\u0627 \u06af\u0648\u06af\u0644&#8221; \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f. \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0628\u0647 \u0635\u0641\u062d\u0647 \u0631\u0636\u0627\u06cc\u062a OAuth2 Google \u0647\u062f\u0627\u06cc\u062a \u0634\u0648\u06cc\u062f. \u067e\u0633 \u0627\u0632 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632\u060c \u0628\u0647 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0647\u062f\u0627\u06cc\u062a \u0645\u06cc \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u062e\u0648\u062f \u0631\u0627 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AA%D9%82%D9%88%DB%8C%D8%AA_%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86\"><\/span>\n<p>  \u062a\u0642\u0648\u06cc\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA_%D8%A7%D8%B1%D8%A7%D8%A6%D9%87_%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86_%D9%85%D8%AE%D8%AA%D9%84%D9%81_OAuth2\"><\/span>\n<p>  \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0645\u062e\u062a\u0644\u0641 OAuth2<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0686\u0646\u062f\u06cc\u0646 \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u0647 OAuth2 \u0631\u0627 \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0622\u0646\u0647\u0627 \u0628\u0647 \u062e\u0648\u062f \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f <code>application.yml<\/code> \u06cc\u0627 <code>application.properties<\/code>. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u0628\u0631\u0627\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 GitHub:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">security<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">oauth2<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">client<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">registration<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">github<\/span><span class=\"pi\">:<\/span>\n            <span class=\"na\">client-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">YOUR_GITHUB_CLIENT_ID<\/span>\n            <span class=\"na\">client-secret<\/span><span class=\"pi\">:<\/span> <span class=\"s\">YOUR_GITHUB_CLIENT_SECRET<\/span>\n            <span class=\"na\">scope<\/span><span class=\"pi\">:<\/span> <span class=\"s\">read:user<\/span>\n        <span class=\"na\">provider<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">github<\/span><span class=\"pi\">:<\/span>\n            <span class=\"na\">authorization-uri<\/span><span class=\"pi\">:<\/span> <span class=\"s\">https:\/\/github.com\/login\/oauth\/authorize<\/span>\n            <span class=\"na\">token-uri<\/span><span class=\"pi\">:<\/span> <span class=\"s\">https:\/\/github.com\/login\/oauth\/access_token<\/span>\n            <span class=\"na\">user-info-uri<\/span><span class=\"pi\">:<\/span> <span class=\"s\">https:\/\/api.github.com\/user<\/span>\n            <span class=\"na\">user-name-attribute<\/span><span class=\"pi\">:<\/span> <span class=\"s\">id<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C_%DA%A9%D8%B1%D8%AF%D9%86_%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\"><\/span>\n<p>  \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0631\u062f\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0646\u062d\u0648\u0647 \u067e\u0631\u062f\u0627\u0632\u0634 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0627 \u0627\u062c\u0631\u0627\u06cc \u06cc\u06a9 \u0633\u0641\u0627\u0631\u0634\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0646\u06cc\u062f <code>OAuth2UserService<\/code>.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.oauth2demo.service<\/span><span class=\"o\">;<\/span>\n\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.oauth2.core.OAuth2AuthenticationException<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.oauth2.core.user.OAuth2User<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.stereotype.Service<\/span><span class=\"o\">;<\/span>\n\n<span class=\"nd\">@Service<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">CustomOAuth2UserService<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">DefaultOAuth2UserService<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nc\">OAuth2User<\/span> <span class=\"nf\">loadUser<\/span><span class=\"o\">(<\/span><span class=\"nc\">OAuth2UserRequest<\/span> <span class=\"n\">userRequest<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">OAuth2AuthenticationException<\/span> <span class=\"o\">{<\/span>\n        <span class=\"nc\">OAuth2User<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"kd\">super<\/span><span class=\"o\">.<\/span><span class=\"na\">loadUser<\/span><span class=\"o\">(<\/span><span class=\"n\">userRequest<\/span><span class=\"o\">);<\/span>\n        <span class=\"c1\">\/\/ Add custom processing here<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">user<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u067e\u0633\u060c \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f <code>SecurityConfig<\/code> \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0633\u0631\u0648\u06cc\u0633 \u06a9\u0627\u0631\u0628\u0631 \u0633\u0641\u0627\u0631\u0634\u06cc:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"o\">.<\/span><span class=\"na\">oauth2Login<\/span><span class=\"o\">(<\/span><span class=\"n\">oauth2<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">oauth2<\/span>\n    <span class=\"o\">.<\/span><span class=\"na\">userInfoEndpoint<\/span><span class=\"o\">(<\/span><span class=\"n\">userInfo<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">userInfo<\/span>\n        <span class=\"o\">.<\/span><span class=\"na\">userService<\/span><span class=\"o\">(<\/span><span class=\"n\">customOAuth2UserService<\/span><span class=\"o\">)<\/span>\n    <span class=\"o\">)<\/span>\n    <span class=\"o\">.<\/span><span class=\"na\">loginPage<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/login\"<\/span><span class=\"o\">)<\/span>\n    <span class=\"o\">.<\/span><span class=\"na\">defaultSuccessURL<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/home\"<\/span><span class=\"o\">,<\/span> <span class=\"kc\">true<\/span><span class=\"o\">)<\/span>\n<span class=\"o\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc OAuth2 \u062f\u0631 Spring Boot \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>authorization_code<\/code> \u0646\u0648\u0639 \u06af\u0631\u0627\u0646\u062a \u0631\u0648\u0634\u06cc \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0628\u0631\u0627\u06cc \u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0634\u0645\u0627 \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u0648\u062b\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0627\u0633\u062a. \u0628\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f OAuth2 \u0631\u0627 \u0628\u0627 \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0645\u062d\u0628\u0648\u0628\u06cc \u0645\u0627\u0646\u0646\u062f Google \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0645\u062a\u0646\u0627\u0633\u0628 \u0628\u0627 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u062e\u0627\u0635 \u062e\u0648\u062f \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0628\u0627 OAuth2 \u0631\u0627\u062d\u062a\u200c\u062a\u0631 \u0645\u06cc\u200c\u0634\u0648\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0646\u0648\u0627\u0639 \u062f\u06cc\u06af\u0631 \u06a9\u0645\u06a9 \u0645\u0627\u0644\u06cc \u0648 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc\u200c\u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647\u200c\u062a\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0627\u06cc\u0634 \u0627\u0645\u0646\u06cc\u062a \u0648 \u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u06a9\u0627\u0648\u0634 \u06a9\u0646\u06cc\u062f. \u06a9\u062f \u0646\u0648\u06cc\u0633\u06cc \u0645\u0628\u0627\u0631\u06a9!<\/p>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A8%DB%8C%D8%A7%DB%8C%DB%8C%D8%AF_%D9%88%D8%B5%D9%84_%D8%B4%D9%88%DB%8C%D9%85\"><\/span>\n<p>  <strong>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0648\u0635\u0644 \u0634\u0648\u06cc\u0645!<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\ud83d\udce7 \u06cc\u06a9 \u067e\u0633\u062a \u0631\u0627 \u0627\u0632 \u062f\u0633\u062a \u0646\u062f\u0647\u06cc\u062f! \u0645\u0634\u062a\u0631\u06a9 \u0634\u062f\u0646 \u062f\u0631 \u062e\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0646!<br \/>\u27a1\ufe0f \u0644\u06cc\u0646\u06a9\u062f\u06cc\u0646<br \/>\ud83d\udea9 \u067e\u0633\u062a \u0627\u0635\u0644\u06cc<br \/>\u2615 \u0628\u0631\u0627\u06cc \u0645\u0646 \u06cc\u06a9 \u0642\u0647\u0648\u0647 \u0628\u062e\u0631<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0627\u0633\u062a\u0627\u062f OAuth2 \u062f\u0631 Spring Boot \u0628\u0627 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645 \u0645\u0627! \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0645\u062b\u0627\u0644 \u0647\u0627\u06cc \u06a9\u062f \u0639\u0645\u0644\u06cc \u0627\u06cc\u0645\u0646 \u06a9\u0646\u06cc\u062f \u062f\u0631 \u0686\u0634\u0645 \u0627\u0646\u062f\u0627\u0632 \u062f\u06cc\u062c\u06cc\u062a\u0627\u0644\u06cc \u0628\u0647 \u0647\u0645 \u067e\u06cc\u0648\u0633\u062a\u0647 \u0627\u0645\u0631\u0648\u0632\u06cc\u060c \u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a. \u06cc\u06a9\u06cc \u0627\u0632 \u0642\u0648\u06cc \u062a\u0631\u06cc\u0646 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":82020,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-82019","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/82019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=82019"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/82019\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/82020"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=82019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=82019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=82019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}