基於spring4和spring security實現oauth2.0教程(註解)

1、OAuth是什麼?    git

    OAuth的英文全稱是Open Authorization,它是一種開放受權協議。OAuth目前共有2個版本,2007年12月的1.0版(以後有一個修正版1.0a)和2010年4月的2.0版,1.0版本存在嚴重安全漏洞,而2.0版解決了該問題。web

2、OAuth2.0有什麼用?    spring

    引用一下OAuth2.0中文文檔中的介紹:  json

    1.須要第三方應用存儲資源全部者的憑據,以供未來使用,一般是明文密碼。    api

    2.須要服務器支持密碼身份認證,儘管密碼認證天生就有安全缺陷。    瀏覽器

    3.第三方應用得到的資源全部者的受保護資源的訪問權限過於寬泛,從而致使資源全部者失去對資源使用時限或使用範圍的控制。    安全

    4.資源全部者不能僅撤銷某個第三方的訪問權限而不影響其它,而且,資源全部者只有經過改變第三方的密碼,才能單獨撤銷這第三方的訪問權限。  服務器

    5.與任何第三方應用的讓步致使對終端用戶的密碼及該密碼所保護的全部數據的讓步。微信

    簡單歸納,就是用於第三方在用戶受權下調取平臺對外開放接口獲取用戶相關信息。  app

    OAuth引入了一個受權環節來解決上述問題。第三方應用請求訪問受保護資源時,資源服務器在獲准資源用戶受權後,會向第三方應用頒發一個訪問令牌(AccessToken)。該訪問令牌包含資源用戶的受權訪問範圍、受權有效期等關鍵屬性。第三方應用在後續資源訪問過程當中須要一直持有該令牌,直到用戶主動結束該次受權或者令牌自動過時。

3、OAuth2.0有哪幾種受權模式?    

    受權碼模式(Authorization Code)(正統方式)(支持refresh token)

    受權碼簡化模式(Implicit)(爲web瀏覽器設計)(不支持refresh token)    

    Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)    

    Client模式(Client Credentials) (爲後臺api調用設計)(不支持refresh token)

1.受權碼模式 (Authorization Code)(用戶、第三方、受權方)

    

具體流程:

        一、用戶利用受權方(QQ、微信、微博)登錄第三方app(滴滴打車、雲打印)

        二、第三方app須要提早訪問受權方接口,向用戶提供受權的頁面

        三、用戶在受權頁面進行是否受權操做

        四、用戶將受權信息提交給受權方

        五、第三方接收到用戶的access_token

具體的流程圖

受權方提供的接口:

    (第一步)http://localhost:8080/securitydemo/oauth/authorize?response_type=code&client_id=bizhanlu&state=userId&redirect_uri=http://www.baidu.com

    參數解析:response_type:指受權類型,必選,這裏填固定值‘code’

         client_id:指客戶端id,必選,這裏填在平臺報備時獲取的appid

         redirect_uri:指重定向URI,可選

         scope:指申請的權限範圍,可選

         state:指客戶端當前狀態,可選,若填了,則認證服務器會原樣返回該值

        重定向到oauth/confirm_access頁面,讓用戶進行受權操做後跳到回調地址,如https://www.baidu.com/?code=hvhj8k&state=userId

        經過code的值用POST訪問下列接口獲取訪問access_token。

        (第二步)http://localhost:8080/iportalSecurity/oauth/token?client_id=bizhanlu&secret_id=111&grant_type=authorization_code&code=hvhj8k&redirect_uri=http://www.baidu.com

        client_id:指客戶端id,必選,這裏填在平臺報備時獲取的appid

        secret_id:指客戶端密鑰,必選,這裏填在平臺報備時獲取的appsecret

        authorization_code:此模式值必須爲authorization_code,必選

        code:oauth/authorize接口經過回調地址返回的code值,必選

        redirect_uri:指重定向URI,可選

        scope:指申請的權限範圍,可選

        state:指客戶端當前狀態,可選,若填了,則認證服務器會原樣返回該值

        返回json:{
                            "access_token": "675905e9-a6e1-43ec-b1d1-9de418713a83",
                             "token_type": "bearer",
                            "refresh_token": "98183ef5-5222-4d31-9907-f1b42fa13718",
                            "expires_in": 43032,
                            "scope": "A B C"
                        }

        (第三步)第三方就可使用access_token訪問用戶接口獲取某些信息了。

2、 受權碼簡化模式(Implicit)(爲web瀏覽器設計)

    此模式簡化了受權碼模式中的第二步,也就是省略了code,直接經過第一步調用後,經過回調地址返回access_token

    (第一步)http://localhost:8080/securitydemo/oauth/authorize?response_type=token&client_id=bizhanlu&state=userId&redirect_uri=http://www.baidu.com

    重定向到oauth/confirm_access頁面,讓用戶進行受權操做後跳到回調地址 :https://www.baidu.com/#access_token=675905e9-a6e1-43ec-b1d1-9de418713a83&token_type=bearer&state=userId&expires_in=41700&scope=A%20B%20C

    (第二步)第三方就可使用access_token訪問用戶接口獲取某些信息了。

3、 Pwd模式(Resource Owner Password Credentials)

(第一步)POST方式訪問:http://localhost:8080/securitydemo/oauth/token?grant_type=password&username=bizhanlu&password=123

返回json:{
                            "access_token": "675905e9-a6e1-43ec-b1d1-9de418713a83",
                             "token_type": "bearer",
                            "refresh_token": "98183ef5-5222-4d31-9907-f1b42fa13718",
                            "expires_in": 43032,
                            "scope": "A B C"
                        }

就簡單獲取access_token

(第二步)第三方就可使用access_token訪問用戶接口獲取某些信息了。

第四種暫時不講了。

關於oauth2.0的總結就這些了,有什麼問題能夠留言,或者聯繫微信/QQ:993009844。項目源碼

相關文章
相關標籤/搜索