OAuth2.0 ורישום לקוח דינמי (באמצעות מחסנית מורשת OAuth של Spring Security)

1. הקדמה

במדריך זה, אנו נכין רישום לקוח דינמי ב- OAuth2.0. OAuth2.0 היא מסגרת הרשאה המאפשרת גישה מוגבלת לחשבונות משתמש בשירות HTTP. לקוח OAuth2.0 הוא היישום שרוצה לגשת לחשבון המשתמש. לקוח זה יכול להיות יישום אינטרנט חיצוני, סוכן משתמשים או סתם לקוח יליד.

על מנת להשיג רישום לקוח דינמי, אנו נשמור את האישורים במסד נתונים במקום בתצורה מקודדת. היישום שאנו הולכים להרחיב תואר בתחילה במדריך האביב של REST API + OAuth2.

הערה: מאמר זה משתמש בפרויקט מורשת Spring OAuth.

2. תלות Maven

ראשית נגדיר את קבוצת התלות הבאה:

 org.springframework.boot spring-boot-starter-web org.springframework spring-jdbc org.springframework.security.oauth spring-security-oauth2 

שים לב שאנחנו משתמשים אביב-jdbc בגלל שאנחנו הולכים להשתמש ב- DB לאחסון המשתמשים הרשומים שזה עתה סיסמאות.

3. תצורת שרת OAuth2.0

ראשית, עלינו להגדיר את שרת ההרשאה OAuth2.0 שלנו. התצורה העיקרית נמצאת במחלקה הבאה:

@Configuration @PropertySource ({"classpath: persistence.properties"}) @EnableAuthorizationServer class class OAuth2AuthorizationServerConfig מרחיב את AuthorizationServerConfigurerAdapter {// config}

יש כמה דברים עיקריים שעלינו להגדיר; בוא נתחיל עם ClientDetailsServiceConfigurer:

תצורת חלל ציבורית ציבורית של @Override (לקוחות ClientDetailsServiceConfigurer סופיים) זורקת חריג {clients.jdbc (dataSource ()) // ...}

זה יבטיח שאנחנו משתמשים בהתמדה כדי לקבל את פרטי הלקוח.

בואו כמובן נקבע את מקור הנתונים הסטנדרטי הזה:

@Bean DataSource ציבורי DataSource () {DriverManagerDataSource dataSource = חדש DriverManagerDataSource (); dataSource.setDriverClassName (env.getProperty ("jdbc.driverClassName")); dataSource.setUrl (env.getProperty ("jdbc.url")); dataSource.setUsername (env.getProperty ("jdbc.user")); dataSource.setPassword (env.getProperty ("jdbc.pass")); להחזיר dataSource; }

וכך, כעת, היישום שלנו ישתמש במסד הנתונים כמקור ללקוחות רשומים, במקום ללקוחות הזיכרון המקודדים הקשיחים.

4. תוכנית DB

בואו נגדיר כעת את מבנה SQL לאחסון לקוחות OAuth שלנו:

צור טבלה oauth_client_details (client_id VARCHAR (256) KEY PRIMARY, resource_ids VARCHAR (256), client_secret VARCHAR (256), scope VARCHAR (256), authorized_grant_types VARCHAR (256), web_server_redirect_uri VARCHARCH (256), VARCHAR (VARCHAR) , refresh_token_validity INTEGER, מידע נוסף VARCHAR (4096), אישור אוטומטי VARCHAR (256));

התחומים החשובים ביותר מ oauth_client_details עלינו להתמקד הם:

  • client_id - לאחסן מזהה של לקוחות שזה עתה נרשמו
  • סוד לקוח - לאחסון סיסמת הלקוחות
  • גישה_סימן_תוקף - המציין אם הלקוח עדיין תקף
  • רָשׁוּיוֹת - כדי לציין אילו תפקידים מותרים עם לקוח מסוים
  • תְחוּם - פעולות מותרות, למשל כתיבת סטטוסים בפייסבוק וכו '.
  • סוגים מורשים_ענקים, המספק מידע כיצד משתמשים יכולים להתחבר ללקוח המסוים (במקרה שלנו זה כניסה טופס עם סיסמה)

שים לב, שלכל לקוח יש יחסים רבים עד רבים עם המשתמשים, וזה אומר באופן טבעי משתמשים מרובים יכולים להשתמש בלקוח יחיד.

5. בואו נתמיד בכמה לקוחות

עם הגדרת סכמת SQL, נוכל סוף סוף ליצור נתונים מסוימים במערכת - ובעצם להגדיר לקוח.

אנו נשתמש בהמשך data.sql סקריפט - איזה Boot Boot יפעל כברירת מחדל - כדי לאתחל את ה- DB:

INSERT INTO oauth_client_details (client_id, client_secret, scope, authorized_grant_types, web_server_redirect_uri, autorities, access_token_validity, refresh_token_validity, additional_information, autoapprove) VALUES ("fooClientIdPassword", "סודי", קוד רענון, סיסמה, foo , null, 36000, 36000, null, true);

תיאור התחומים החשובים ביותר ב oauth_client_details ניתן בסעיף הקודם.

6. בדיקות

על מנת לבדוק את רישום הלקוח הדינמי, עלינו להריץ את שניהם אביב-אבטחה-שרת oauth ו אביב-ביטחון-משאב oauth פרויקטים, בנמלי 8081 ו- 8082, בהתאמה.

עכשיו, סוף סוף נוכל לכתוב כמה מבחנים חיים.

נניח, שרשמנו לקוח עם שם מזהה fooClientIdPassword, שיש לו גישה לקרוא foos.

ראשית, ננסה להשיג אסימון גישה משרת האימות באמצעות לקוח שהוגדר כבר:

@Test הציבור בטל שניתןDBUser_whenRevokeToken_thenAuthorized () {String accessToken = obtainAccessToken ("fooClientIdPassword", "john", "123"); assertNotNull (accessToken); }

והנה ההיגיון בקבלת אסימון Access:

מחרוזת פרטית obtainAccessToken (מחרוזת clientId, שם משתמש מחרוזת, סיסמת מחרוזת) {Map params = HashMap new (); params.put ("grant_type", "password"); params.put ("client_id", clientId); params.put ("שם משתמש", שם משתמש); params.put ("סיסמה", סיסמה); תגובת תגובה = RestAssured.given (). Auth (). מונע () .basic (clientId, "סודי"). ו- (). עם (). Params (params) .when () .post ("// localhost: 8081 / spring-security-oauth-server / oauth / token "); return response.jsonPath (). getString ("access_token"); }

7. מסקנה

במדריך זה למדנו כיצד לרשום באופן דינמי מספר בלתי מוגבל של לקוחות עם מסגרת OAuth2.0.

ניתן למצוא את היישום המלא של מדריך זה ב- GitHub - זהו פרויקט מבוסס Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.

שים לב שכדי לבחון תצטרך להוסיף לקוחות ל- DB וכי ה- .לזכר() config כבר לא יהיה תקף. אם אתה רוצה להשתמש בישן.לזכר() config, יש קובץ שני המכיל תצורה עם לקוחות עם קוד קשיח.


$config[zx-auto] not found$config[zx-overlay] not found