OAuth 2.0受權之受權碼受權

  OAuth 2.0 是一個開放的標準協議,容許應用程序訪問其它應用的用戶受權的數據(如用戶名、頭像、暱稱等)。好比使用微信、QQ、支付寶登陸等第三方網站,只須要用戶點擊受權按鈕,第三方網站就會獲取到用戶在微信、QQ、支付寶的信息(固然信息都是不敏感數據如用戶名、頭像、暱稱等),獲取這些信息後,第三方網站就能夠用這些信息建立一個第三方用戶帳戶,不須要再用戶手動填寫用戶名、頭像、暱稱等......要想了解這個受權過程,咱們須要想了解什麼是OAuth 2.0.api

OAuth 2.0類型

  在OAuth 2.0中"受權類型"指的是應用程序獲取令牌的方式。OAuth 2.0定義了若干受權類型,有Authorization Code(受權碼)、Implicit(隱式受權)、Password(密碼受權)、Client Credentials(客戶端憑證)、Device Code(設備代碼)、Refresh Token(刷新令牌)。根據每種受權的應用場景選擇不一樣的受權。每種受權類型都針對特定用例進行了優化,不管是Web應用程序,本機應用程序,沒法啓動Web瀏覽器的設備或服務器到服務器應用程序。對於網站、手機app受權,如今用的最普遍的就是受權碼受權。瀏覽器

受權碼受權

  受權碼與其餘受權類型不一樣點是,它說先要求應用程序啓動瀏覽器來開始流程。受權的大體流程以下:安全

  • 應用程序打開瀏覽器,將網頁轉到OAuth服務器。(如用微博登陸豆瓣,會跳轉到微博受權頁面。)
  • 用戶看到受權提示,而後贊成給應用受權。(用戶點擊受權按鈕,贊成給豆瓣受權用戶的微博信息。)
  • 用戶會重定向到應用程序,而且在返回的網址中帶了受權碼。(點擊受權按鈕後,會回到豆瓣,在網址中會帶有Code.)
  • 應用程序經過Code去獲取access token.

第一步、獲取用戶的受權

  首先應用程序須要構造一個URL,URL的結構以下:https://authorization-server.com/auth?response_type=code&client_id=29352915982374239857&redirect_uri=https%3A%2F%2Fexample-app.com%2Fcallback&scope=create+delete&state=xcoiv98y2kd22vusuye3kch服務器

  • response_type:這是告訴受權服務器,返回類型,code表示受權碼受權。
  • client_id:應用程序的公共標識符。
  • redirect_uri:告訴受權服務器在用戶批准受權後,將獲取的Code發送到哪裏。
  • scope:應用受權做用域(如微信,當scope=snsapi_base時,只能獲取用戶的openId。當scope=snsapi_userinfo時,能夠獲取暱稱、性別、所在地)。
  • state:應用程序傳遞的一個隨機數,用來防止CSRF攻擊。

  如豆瓣須要獲取微信的受權信息,根據微信文檔,拼接這個URL,會重定向到微信受權頁面,當用戶點擊受權時,會返回到redirect_uri對應的值的網址,微信會在網址後面添加上code=CODE&state=STATE。code的值就是微信返回的信息,state是的值是應用程序以前傳遞的值。微信

第二步、重定向返回應用程序

  應用程序須要接受返回的code。注意code有有效期,而且只能使用一次,微信認證爲5分鐘過時,支付寶爲3分鐘到24小時。app

第三步、經過code獲取access token

  獲取access token應用程序須要經過POST請求並帶着下面的參數請求受權服務器。優化

  • grant_type=authorization_code:告訴受權服務器,採用的受權類型是受權碼類型。
  • code:獲取的code。
  • redirect_uri:重定向網址。此參數不是必須的。
  • client_id:應用程序Id
  • client_secret:安全碼。若是沒有安全碼,每一個應用程序(包括攻擊者的應用程序)均可以去獲取微信的受權,由於這些參數(除了安全碼)均可以拼接。爲了安全,當你的應用程序須要微信受權登陸時,申請了微信的應用,微信會給你一個secret。

請求受權服務器後,服務器會返回網站

What is the OAuth 2.0 Authorization Code Grant Type?{ "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3", //咱們最終所須要的access token "token_type":"bearer",              //令牌類型 "expires_in":3600,                 //access_token接口調用憑證超時時間,單位(秒) "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk", //當access token超時失效後,須要用refresh token來再次獲取access token "scope":"create delete"               //應用受權做用域 }
受權流程到此就結束了。
參考:
相關文章
相關標籤/搜索