本人經過2周的學習,成功搭建了認證伺服器,資源伺服器和客戶端 。下麵是本人對 oauth2的理解,以及spring-security的使用,如果理解錯誤的地方,還望指正。 現在代碼有點凌亂,過段時間會放到github上面的,本人會在代碼中添加詳細註釋,供學習交流使用 理解 1.認證伺服器 如抖音可以 ...
本人經過2周的學習,成功搭建了認證伺服器,資源伺服器和客戶端 。下麵是本人對 oauth2的理解,以及spring-security的使用,如果理解錯誤的地方,還望指正。
現在代碼有點凌亂,過段時間會放到github上面的,本人會在代碼中添加詳細註釋,供學習交流使用
理解
1.認證伺服器
如抖音可以選擇QQ或者微信登錄,此時QQ或者微信就是認證伺服器
1.認證::用戶認證和客戶端認證,只要用戶或者客戶端在認證伺服器中註冊即可
2.授權:通過認證之後賦予許可權,
伺服器認證成功後,會返回token, token中攜帶用戶信息,用戶擁有的角色信息,客戶端信息
對於QQ,微信登錄會返回一個openId,這個暫時不講, 自己搭建的認證伺服器暫時沒有openId,後期有時間再去研究
2.資源伺服器
提供服務的伺服器,如獲取用戶信息,用戶頭像等,需要攜帶token請求獲取想要的信息(資源伺服器會解析token,判斷是否有許可權)
3.客戶端
如抖音,知否,需要通過認證伺服器(QQ,微信)認證的應用伺服器。
客戶端通過認證拿到token,就可以訪問資源伺服器了
那麼第三方客戶端是如何完成授權的呢?
解讀4中授權模式 :
1.授權碼模式:推薦使用的授權模式,流程如下,下麵給予解析
解析:
***** client_id為客戶端Id,必須註冊到認證伺服器, redirect_uri 這個地址後面獲取到code要跳轉的地方,也就是這個地址能拿到認證伺服器返回的code ****
1.比如我現在要選擇登陸csdn,打開登錄頁面,我們可以選擇qq,微博,百度等 登錄方式,
2.我們選擇第三方登陸,這時候瀏覽器會重定向http://localhost:8080/oauth/authorize?response_type=code&client_id=myclient_id&redirect_uri=http://baidu.com,不經過客戶端;response_type=code為特定參數
3.我們要攜帶這些參數response_type,client_id,redirect_uri 去認證,就會跳轉到登錄頁面。client_id,redirect_uri 是你註冊到認證伺服器的信息
4.我們填寫登錄信息並登錄,然後跳轉到讓用戶授權(授可以預設同意授權,也可以讓用戶自己在頁面上確定)
5.認證並授權通過,重定向到redirect_uri 並帶上code參數,如https://www.baidu.com/?code=o5NsTH,有人會問為什麼不直接返回token? 這重定向要經過瀏覽器的,直接返回token是不安全的
6.redirect_uri 為客戶端中的一個rest介面,這樣客戶端就拿到token,並使用token和client_id,client_secret等換取token,grant_type=authorization為特定參數
http://localhost:8080/oauth/token? grant_type=authorization_code &code=o4YrCS&client_id=pair &client_secret=secret&redirect_uri=http://baidu.com
這個請求是在客戶端中遠程調用的,驗證通過返回token
7,拿到token後就可以訪問資源伺服器了,知道要訪問的介面並把token帶過去,這一步也是通過客戶端遠程調用的,http://localhost:8080/rest/api/getuserInfo?access_token=a4ae5a76-289d-2356-a421-9652sa857678
下麵是一個客戶端通過第三方登錄的簡圖
2.密碼模式
3.客戶端模式
4.簡化模式