Samples for OAuth 2.0 Provider & Client
OAuth2 Provider & Consumer Sample์ ๋๋ค. https://tools.ietf.org/html/rfc6749 ๋ฅผ ๊ทผ๊ฑฐํ์ฌ ์์ฑํ์์ต๋๋ค. ์ด ์ฝ๋๋ ์ํ ์ฝ๋์ ๋๋ค. ์์ ์ ์ธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ์ง ๋ง์์ฃผ์ธ์. ์คํฐ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํด์ฃผ์ธ์. ํ๊ฒฝ์ค์ ์ ๋ํ ์ง๋ฌธ, ์ฝ๋ ์์ฒด์ ๋ํ ์ง๋ฌธ์ ๋ฐ์ง ์๊ฒ ์ต๋๋ค. OAuth2.0์ ๋ํ ์ง๋ฌธ๋ ์์ RFC ๋ฌธ์๋ฅผ ์ง์ ์ฝ์ด๋ณด์ธ์.
์์ ์ ์ธ ๋ชฉ์ ์ด ์๋๋ผ๋ฉด ์ด์ฉ๊ฐ๋ฅํ ์ฝ๋์ ๋๋ค. ์์ ์ ์ธ ๋ชฉ์ ์ผ๋ก๋ ์ฌ์ฉํ์ง ๋ง์์ฃผ์ธ์.
์ด ์ฝ๋์ ์ ์๊ถ์ stepanowon@hotmail.com ์๊ฒ ์์ต๋๋ค.
A. environment
- Oracle 10g Express(H2 Database ์ฌ์ฉ๊ฐ๋ฅ)
- Java 1.6 + Spring 3.1 + Eclipse(indigo) + Maven + iBatis 2.0 + Tomcat 6.0(HTTP Port 8000)
B. project
- oauth2provider : ์ธ์ฆ์๋ฒ & ๋ฆฌ์์ค ์๋ฒ
- oauth2client : web server flow ํด๋ผ์ด์ธํธ
- oauth2client_agentflow : User Agent flow ํด๋ผ์ด์ธํธ
C. configuration
-
table ์์ฑ
- DB๋ oracle 10g express์ oauth2/oauth2 ๊ณ์ ์ ์์ฑํ์ฌ์ผ ํจ.
- oauth2provider์ src ๋๋ ํ ๋ฆฌ์ oauth2provider.sql ํ์ผ์ ์ฝ์ด ํ ์ด๋ธ ์ค์น ์ฌ์ฉ์ ๊ณ์ ์ t1000, gdhong, arnold ์ธ๊ฐ์ ๊ณ์ (์ํธ ๋์ผ)
-
์์๊ฐ ์ค์
-
net.oauth.v2 ํจํค์ง์ OAuth2Constantํด๋์ค์์ ์์๊ฐ๋ณ๊ฒฝ
- USE_REFRESH_TOKEN : refresh token ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํจ.
- AES_ENCRYPTION_KEY : ๋ด๋ถ์์ ํ ํฐ ์์ฑ์ ์ฌ์ฉํ AES ์ํธํ ํค ๊ฐ
- EXPIRES_IN_VALUE : refresh token ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ(๊ธฐ๋ณธ๊ฐ:3600(์ด))
-
net.oauth.v2 ํจํค์ง์ OAuth2Scope ํด๋์ค์์ ์์๊ฐ ๋ณ๊ฒฝ
- ์กฐ์ง์ ๋ฐ๋ผ scope ์์๊ฐ ์ค์ (ํ์ฌ๋ 6๊ฐ์ ์ํ scope์ ์ค์ ํ์์)
- resource ์๋ํฌ์ธํธ url ๋ณ๋ก ๊ถํ ์ค์ (scope ์ง์ )
-
D. endpoint
-
login & client app ๋ฑ๋ก
- com.multi.oauth2.provider.view.controller.LoginController ํด๋์ค ์ฐธ์กฐ
- com.multi.oauth2.provider.view.controller.ClientController ํด๋์ค ์ฐธ์กฐ
-
authorization
- /oauth2provider/oauth2/auth
- response_type ํ๋ผ๋ฏธํฐ๊ฐ code์ผ ๊ฒฝ์ฐ๋ web server flow
- response_type ํ๋ผ๋ฏธํฐ๊ฐ token์ผ ๊ฒฝ์ฐ๋ user agent flow(Mobile App, Desktopํฌํจ)
- /oauth2provider/oauth2/auth
-
token
- /oauth2provider/oauth2/token
- grant_type ํ๋ผ๋ฏธํฐ๊ฐ authorization_code ์ธ ๊ฒฝ์ฐ๋ server flow๋ก access token ๋ฐ๊ธ
- grant_type ํ๋ผ๋ฏธํฐ๊ฐ refresh_token ์ธ ๊ฒฝ์ฐ๋ access token์ ๊ฐฑ์ ํ๊ฒ ๋จ.
- /oauth2provider/oauth2/token
-
protected resource
- ์ด ์ํ์์์ protected resource๋ ์น์ธํ ์ฌ์ฉ์์ ๊ณ์ ์ ๋ณด๋ก ๊ฐ์ ํ์๊ณ , endpoint๋ /oauth2provider/resource/myinfo.do ์ด๋ค.
- ์ฌ๋ฌ protected resource์ ๋ํ ๊ถํ์ ๋ถ์ฌํ๊ธฐ ์ํด end point๋ณ ๊ถํ์ net.oauth.v2.OAuth2Scope ํด๋์ค์ scopeUrlMap ํ๋์ Hashmap์ผ๋ก ์์ฑํ๋ค
- access token ์ ๋ณด ๊ฒ์ฆ, scope ๊ฒ์ฆ์ Interceptor(com.multi.oauth2.provider.util.Oauth2Interceptor)๋ฅผ ์ด์ฉํด Controller ์คํ ์ ์ ์ฒ๋ฆฌํ๋ค.
- ์์ธ ์ฒ๋ฆฌ๋ Controller ์์์ OAuth2Exception ์ ๋ฐ์์ํค๋ฉด ExceptionResolver๊ฐ error ํ์ด์ง๋ก ์ด๋์์ผ OAuth2.0 spec์ ๋ฐ๋ฅธ ์๋ฌ ์ฝ๋์ ๋ฉ์์ง๋ฅผ ์๋ตํ๋ค.
- ํด๋ผ์ด์ธํธ ์ฑ์ด user agent ํ์ ์ผ๋ก ๋ฑ๋ก๋์๋ค๋ฉด Protected Resource ์ ๊ทผ์ Cross Domain ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ค ์ ์๋๋ก CORS(Cross Origin Resource Sharing)๊ธฐ๋ฒ์ ์ง์ํ๋๋ก ํ์๋ค.
-
์ธ์ฆ๊ณผ์ ๋๋ token ๋ฐ๊ธ ๊ณผ์ ์์ CSRF(Cross Site Request Forgery)๊ณต๊ฒฉ์ ๋ํ ๋์์ผ๋ก OAuth2.0์์ recommended๋ state ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์๋ค.
E. ์ถ๊ฐ/๊ฐ์ ํ ์ฌํญ..
-
OAuth 2.0 ์์๋ ์๋ฌ ๋ฐ์์ WWW-Authenticate ํค๋๋ฅผ ํตํด ์๋ตํ๋๋ก ํ๊ณ ์์ผ๋ Google, Facebook์ ๋ค๋ฅธ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์๋ค. ๋ณธ ์ํ์ facebook ์คํ์ผ(?)๋ก ์์ฑํ์๋ค.
-
OAuth2.0 ์ ์ฒ๋ฆฌ๊ณผ์ ์ค Web Server flow ์ user agent flow๋ง ์ฒ๋ฆฌํ์๋ค.
- password credential๊ณผ client credential ๋ฐฉ์์ ์์ฑํ์ง ์์๋ค. ๋์ com.multi.oauth2.provider.view.controller.OAuth2Controller ํด๋์ค์ 280๋ฒ ๋ผ์ธ์์ ์ฃผ์์ฒ๋ฆฌํ์ฌ ํฅํ ๊ตฌํํด์ผ ํจ์ ๋ช ์ํ์๋ค.
- refresh token์ ์ฌ์ฉํ ๊ฒ์ธ์ง๋ OAuth2Constant์ ์์๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋จ.
- refresh token์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ access token์ ์์ฑํ์ง ์๊ณ ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ ์์ฑํ๋๋ก ํ์์. --> ๋๋ค๊ฐ์ผ๋ก ํ ํฐ์ ์์ฑํ์ฌ DB์ ์ ์ฅํ๋๋ก ๋ณ๊ฒฝ๊ฐ๋ฅ
-
์ด ์ํ์์๋ redirect_uri ๊ฐ์ ๋น๊ตํ๋ validation ๊ณผ์ ์ ๊ฑฐ์น๋ฏ๋ก ํด๋ผ์ด์ธํธ App์ ๋ฑ๋กํ ๋ ๋ฐ๋์ ์ ๊ทผ๊ฐ๋ฅํ URL์ ์ ๋ ฅํด์ผ ํจ( localhost ํ์ฉ)
F. ์๋ฆผ์ฌํญ
-
์ด ์ํ์ ์ ์๋ํ์ง๋ง ์ ๋๋ก๋ ์ค๊ณ์์ด ๋๋ฑ๊ฑฐ๋ฆฌ๋ฉด์ ๋ง๋ค์์.
-
๋ฐ๋ผ์ ์ ์ ๋ฆฌ๋ ์ฝ๋๋ ์๋. ์ฃผ์๋ ๊ฐ๋ฐ์๋ฐ์.
-
๋๋ฒ๊น ๋ชฉ์ ์ผ๋ก ์ฝ๋ ์ฌ์ด์ฌ์ด์ ์ฝ์ ์ถ๋ ฅํ๋ ์ฝ๋๊ฐ ๋ง์ผ๋ ์์์๋ค ์ ๊ฑฐํ๊ณ ํ ์คํธํด์ผ ํจ.
-
oracle 10g ๋์ ์ ๋ค๋ฅธ DB ์ธ๊ฑฐ๋ฉด maven dependency, applicationContext.xml, oauth2.xml, oauth2provider.sql ํ์ผ์ ์์ ํ์ฌ ์ฐ๋ฉด ๋จ.
G. OAuth2.0 Client
-
oauth2Client
- Web Server flow๋ก ์ฒ๋ฆฌํ๋๋ก ๋ง๋ client์.
- HTTP ํต์ ์ ์ํด apache common์ HttpClent ํด๋์ค ์ฌ์ฉ
- client ๊ฐ ์์๋ jsp๋ก ๊ฐ๋จํ ์์ฑ
- Settings.java ํ์ผ์ ์ฐพ์ client_id, client_secret, ๊ฐ๊ฐ์ endpoint uri๋ฅผ ๋ณ๊ฒฝํ ํ ์คํํจ.
-
oauth2client_agentflow
- User Agent Flow ๋ฐฉ์์ Client์.
- html ํ์ผ๋ก ์์ฑ
- jQuery๋ฅผ ์ฌ์ฉํ ์น์ฑ, webview๋ฅผ ํตํด ์ธ์ฆํ๊ณ access token์ ํ๋ํ๋ ๋ชจ๋ฐ์ผ์ฑ. ์ด๋ ๊ฒ ๋๊ฐ์ง์ ๊ฒฝ์ฐ ์ด ์ฝ๋๋ฅผ ์ฐธ์กฐํ ์ ์์.
- index.html๊ณผ callback.html์ ๋ด๋ถ์ client_id, client_secret, ๊ฐ๊ฐ์ endpoint๋ฅผ ์ค์ ํ๊ณ ์คํํจ.
-
์คํ์ ์์ client app ์ ์ธ์ฆ์๋ฒ(oauth2provider)์ ๋ฑ๋กํด์ผ ํจ.