2019年1月29日 星期二

OAuth2 Server實作,使用 Spring Boot

參考文件:
Spring OAuth 2 Developers Guide

如果你有很多系統但想用同一個方式登入,存取資源的話,建立 OAuth2 Server是一個好方法,可以參考 spring-security-oauth的方式來建立。 但目前很多範例是用 Spring Boot來建立,我參考的 Secure Spring REST With Spring Security and OAuth2 (github source code) 就是。
幾個點跟大家分享:


儲存 token, user帳號、宓碼會有三種方式
1.InMemory的方式,也是預設的方式

2.把資訊記錄在資料庫內,使用 jdbc data store,參考的範例內有 H2和 Postgresql,其它分享有用 MySQL的方式,如果是用 H2的話,一開始應該會放在本機,如果要用 remote模式要參考 Allow remote access to H2 Database設定,宓碼變更請參考 set password

3.jwt方式spring security 5.1開始就只支援這種方式


文章有提到會建立 Authorization Server, Resource Server,實際上是建立相關的 configuration class設定的動作,基本上有三個,也可以只寫一個 class extends 三個類別

1.extends WebSecurityConfigurerAdapter

configure(AuthenticationManagerBuilder auth) 方法是使用者登入時,帳號、宓碼的檢查,除了使用 auth.userDetailService之外,可以用 auth.authenicationProvider 放入自製的 Authentication Provider

2.extends AuthorizationServerConfigurerAdapter
設定 token的管理,範例用 H2,其中一個資料表 OAUTH_CLIENT_DETAILS 欄位WEB_SERVER_REDIRECT_URI要有回傳網頁的值,比如 http://****/login ,多個可以用逗號分開,如果沒有給的話,以我的環境為 spring framework 5.0.2,boot 2.0.1,OAuth 2.3.3會出現錯誤訊息。因為 Spring OAuth2 Client也是用 Spring Boot,所以回傳的網頁一定是 /login,系統才會自動處理回傳的 authorization code,你寫其他網頁是不會自動處理的

3.extends ResourceServerConfigurerAdapter
存取資源的限制,需要授權後才可以存取

範例大部份是把 Authorization Server, Resource Server放在一起,也可以分開,分開可以參考 Baeldung/spring-security-oauth

設定的類別會有 passwordEncoder的設定,是使用了 BCryp加密技術,這不是資料在傳輸過程的加密,是把資料加宓過再放在資料庫內,這種加密技術是相同的字串每次加密時產生的亂碼字碼都會不相同,但他可以用 match的方式去比對兩個亂碼字碼是否代表同一個字串

最後是 dependency設定,因為是使用 boot,只要參考範列上設定即可



沒有留言:

張貼留言