github源碼地址:
https://github.com/spring-cloud/spring-cloud-security
前言:
什么是開放平台接口
場景 :
總公司與子公司 對接接口 還有一些合作伙伴
總公司 提供接口 1、能夠獲取到哪個子公司調用 2、授權機制,能夠靈活控制接口調用權限。阿里和順豐鬧矛盾,順豐把權限修改阿里巴巴就不能調用接口。
很多公司都有開放平台接口可以供我們練習使用的哈哈:比如騰訊的QQ互聯網、微信開放平台、螞蟻金服開放平台 、微博開放平台,比如實現功能QQ聯合登陸、微信掃碼登陸。都提供了相應的開放平台。
訪問:https://github.com/spring-cloud/spring-cloud-security 源碼中有這個組件 幫助快速搭建開放平台 實現授權流程
OAuth: OAuth(開放授權)是一個開放標准,允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方網站或分享他們數據的所有內容。
QQ登錄OAuth2.0:對於用戶相關的OpenAPI(例如獲取用戶信息,動態同步,照片,日志,分享等),為了保護用戶數據的安全和隱私,第三方網站訪問用戶數據前都需要顯式的向用戶征求授權。
QQ登錄OAuth2.0采用OAuth2.0標准協議來進行用戶身份驗證和獲取用戶授權,相對於之前的OAuth1.0協議,其認證流程更簡單和安全。
注意使用這個框架時候,表名不要隨便改!底層都是寫好了的昂!
我們自己做完開放平台api接口,配備的還要有文檔,我們自己整合swagger就OK了。
常用開放平台
QQ互聯網開放平台
http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0
什么是Oauth2
在開放平台接口設計中,遵循Oauth2.0協,認證授權協議(JWT)
在微服務里面,Oauth2 有密碼模式 授權碼模式
認證授權協議,其實都是用鏈接,點解時候發起授權。比如點擊登錄,點擊了一個連接進行授權。
小結:
OAuth: OAuth(開放授權)是一個開放標准,允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方網站或分享他們數據的所有內容。
QQ登錄OAuth2.0:對於用戶相關的OpenAPI(例如獲取用戶信息,動態同步,照片,日志,分享等),為了保護用戶數據的安全和隱私,第三方網站訪問用戶數據前都需要顯式的向用戶征求授權。
QQ登錄OAuth2.0:采用OAuth2.0標准協議來進行用戶身份驗證和獲取用戶授權,相對於之前的OAuth1.0協議,其認證流程更簡單和安全。
概念:
appId (商戶號,給子公司或者合作商戶提供的)+ appKey(密鑰,驗證密鑰) (這倆配套的 都是必備的,並且appID永久不能改,appKey可以改)
accessToken 調用接口權限訪問令牌
回調地址 授權成功 重定向地址 保證安全性 不要隨便拼接成別的地址了
Authorization code 通過授權碼獲取accessToken
openId 開放平台生成唯一的id
體驗下開放平台——調用QQ互聯網接口的大體流程:
1、 生成授權鏈接,獲取授權碼
生成授權連接: 我截了個網易雲音樂的圖
點擊之后:
用戶點擊之后,才會獲取授權碼
注意這個連接的 client_id 就是 appId (商戶號,給子公司或者合作商戶提供的, 第三方需要的)
state是防止csrf攻擊的,隨機生成的
PS:如果我們自己設計的話,重要表結構: 回調地址的作用:以連接形式跳轉到騰訊獲取授權碼,用戶授權成功之后,跳轉到回調地址redirect_uri回調地址(我們自定義的地址)
上面的那個連接是網易自己封裝的,我隨便截的圖,我們開發時候自己封裝連接,在我們自己的網站上面,點擊這個連接,然后會跳轉到騰訊那邊
https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101462456&state=888&redirect_uri=http://toov5.fuck.com/qqLoginBack 我們自己拼接的
點擊后:
會調用:http://toov5.fuck.com/qqLoginBack?code=23EDESD2346FSDFNWE436346&state=99
2、 使用授權碼獲取AccessToken
獲取到授權碼之后,代表登錄成功了,但是不代表合作伙伴已經對接成功。 授權碼獲取accessToken,然后再去獲取openId,然后再去數據庫查詢關聯的openId。有的話直接登錄,沒有就需要關聯之
令牌的作用,就是臨時的效果作用(10分鍾)。
https://graph.qq.com/oauth2.0/token? grant_type=authorization_code&client_id=101462456&client_secret=23EDESD2346FSDFNWE436346&code=23EDESD2346FSDFNWE436346 & redirect_uri=http://mayikt.s1.natapp.cc/qqLoginBack
授權類型 密鑰 配置好的appKey 授權碼 返回的 Authorization code : 回調地址
在Spring Cloud里面流程底層已經幫助實現了哈 只要關注表接口就OK了
通過訪問這個地址就會獲取到 accessToken!! 拿到accessToken就可以調用接口了! (父公司可以通過 accessToken 逆向出 誰在調用我的接口。 在表里面accessToken和openId是關聯的(每個合作的網站www.toov5.com是唯一的,一個域名一個openid的))、
表結構:
3、 使用AccessToken獲取openId
通過accessToken之后,進而獲取用戶openId
自我拼接開發:
https://graph.qq.com/oauth2.0/me?access_token=B2FD1997D149313F16C93D91C75AC75E
訪問后:
獲取到 openId就可以獲取到用戶相關信息了,授權碼只能用一次! 授權了一段時間后就銷毀了。需要重新授權哈
4、 使用openId獲取用戶信息
https://graph.qq.com/user/get_user_info?access_token=B2FD1997D149313F16C93D91C75AC75E&oauth_consumer_key=101462456&openid=4B1717CBBFE1E900D2A1482C4A18B3BD
accessToken appId openId
此時會返回各種用戶信息的~ 包括頭像 圖片之類的 性別 地址等等
注: 數據庫中 user 表 新增一個字段 qq_pen_id 字段
總結:
注: QQ聯合登錄基於Oauth2.0實現的
認證授權協議: 通過連接進行授權
1、生成Code連接 后去授權碼 (用戶點擊)
2、使用用戶獲取的授權碼,獲取對應的accessToken (臨時的效果作用)
3、使用accessToken獲取用戶openId(調用第三方接口)
4、使用penId獲取用戶信息
訪問這個連接 會讀取qq信息,哪個賬戶在登錄
點擊確定 跳轉到回調的url中 並且攜帶者code
示例:
1、生成授權CODE鏈接,獲取授權碼 ----用戶點擊
https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101462456&state=888&redirect_uri=http://toov5.s1.natapp.cc/qqLoginBack
2、使用用戶獲取的授權碼,獲取對應的accessToken
https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=101462456&client_secret=4488033be77331e7cdcaed8ceadc10d5&code=E91DF5B0E2455A6B2AF25CD9FA1C7582&
redirect_uri=http://toov5.s1.natapp.cc/qqLoginBack
3、使用accessToken獲取用戶openid
https://graph.qq.com/oauth2.0/me?access_token=B2FD1997D149313F16C93D91C75AC75E
4、使用openid獲取用戶信息
https://graph.qq.com/user/get_user_info?access_token=B2FD1997D149313F16C93D91C75AC75E&oauth_consumer_key=101462456&openid=4B1717CBBFE1E900D2A1482C4A18B3BD
Oauth2授權原理
OAuth認證和授權的過程如下:
1、用戶訪問第三方網站網站(自公司),想對用戶存放在服務商的某些資源進行操作。
2、第三方網站(自公司)向服務商(父公司)請求一個臨時令牌。
3、服務商驗證第三方網站的身份后,授予一個臨時令牌。
4、第三方網站獲得臨時令牌后,將用戶導向至服務商的授權頁面請求用戶授權,然后這個過程中將臨時令牌和第三方網站的返回地址發送給服務商。
5、用戶在服務商的授權頁面上輸入自己的用戶名和密碼,授權第三方網站訪問所相應的資源。
6、授權成功后,服務商將用戶導向第三方網站的返回地址。
7、第三方網站根據臨時令牌從服務商那里獲取訪問令牌。
8、服務商根據令牌和用戶的授權情況授予第三方網站訪問令牌。
9、第三方網站使用獲取到的訪問令牌訪問存放在服務商的對應的用戶資源。
獲取accessToken時候需要client_id 和client_client_secret
openId 獲取用戶信息 每個合伙網站保證唯一
www.toov5.com 這個域名的openId 唯一