OAuth2.0 原理簡介

寫在前面:

    在正式介紹OAuth2.0以前咱們先來看一個場景:小李是一個文藝小青年, 常常喜歡出去旅遊而且把本身旅行中的美景照片分享到各大社交網站上,好比朋友圈,新浪微博。小李立刻要向女友求婚了,他想把這三年來和本身女友出去旅遊的照片打印出來作成照片牆,好在求婚的時候講女朋友感動的一塌糊塗,而後你懂得...,那麼問題來了,按照小李帶女友一個月出去玩一次,每次分享30張照片,三年就是30 * 12 * 3 = 1080 張,小李如今想把這1080張照片所有打印出來他首先得找個提供打印照片服務的公司(美圖快印),而後把須要打印的照片給到服務公司而後才能打印。怎麼把這些照片給到美圖快印呢,通常來講有下面兩種方式:git

1.小李到本身的微博相冊中吭哧吭哧下載他須要打印的全部照片,而後裝到U盤裏或者轉儲到網盤裏,再給到美圖快印(那但是1080張照片啊,純手工操做,好累啊)github

2.小李到美圖快印告訴工做人員本身的帳戶名和密碼,並告訴他那些須要打印,那些不須要打印,而後小李還會擔憂:本身和女朋友的親密照被工做人員看到了怎麼辦(更可怕的是某一天本身會不會出如今某論壇上成爲網紅)?萬一他記住了個人密碼而後悄悄的登錄上去把個人密碼改了怎麼辦?。。。。安全

小李以爲有點頭疼了,有沒有什麼方法客戶既不告訴工做人員本身的帳號和密碼又可以方便快捷的把照片給到美圖快印呢?服務器

這就要說到咱們今天的正題了,用OAuth就能夠輕鬆的解決此類特定範圍的受權問題。框架

OAuth2.0簡介:  

    OAuth2.0 是一個開放的工業標準的受權協議,它容許用戶受權讓第三方應用直接訪問用戶在某一個服務中的特定資源,可是不提供給第三方帳號及密碼信息。完整定義請移步官網:https://oauth.net/2/網站

OAuth2.0的基本概念

    在瞭解OAuth2.0以前咱們有必要先介紹一下下面幾個基本的概念:加密

1. 資源全部者(Resource Owner):一個可以訪問受保護資源的實體。當資源全部者是一我的時,它被稱爲終端用戶。(小李)spa

2. 資源服務器(Resource Server):託管受保護資源的服務器,可以使用訪問令牌接受和響應受保護的資源請求。(新浪微博).net

3. 客戶端(Client):表明資源全部者和其受權的應用程序來保護資源請求。術語客戶端並不意味着任何特定的實現特徵(例如,應用程序是否在服務器、桌面或其餘設備上執行)(美圖快印)翻譯

4. 受權服務器(Authorization Server):在成功驗證資源全部者並得到受權以後,服務器向客戶端發出訪問令牌。(受權服務器是用來管理Resource Owner,Resource Server,Client的中間人)

Authorization Server和Resource Server可使獨立的服務提供商,也能夠是在一塊兒的,好比上面例子中新浪微博既做受權服務器也用來存儲用戶的圖片資源,OAuth2解決的問題是:經過Authorization Server能夠提供一個訪問的憑據(token)給client(美圖快印的工做人員),使得client能夠在不知道Resource Owner以及Resource Server的用戶名和密碼的狀況下訪問到Resource Owner受保護的資源,它是一個完美的中間人。  

 OAuth2.0詳解

一般 Resource server自己就提供Authorization server服務,它主要提供兩類接口:

  1. 受權服務接口:接受Client的受權請求,並引導用戶到Resource server完成登錄受權的過程。
  2. 獲取訪問令牌的接口:使用受權接口提供的許可憑據來頒發Resource owner的訪問令牌給Client,或由Client更新過時的訪問令牌。

除此以外還須要提供一個第三方應用程序註冊管理的服務。一般狀況下會爲註冊完成的第三方應用程序分配兩個成對出現的重要參數:

  1. client_id:第三方應用程序的一個標識id,這個信息一般是公開的信息,用來區分哪個第三方應用程序。
  2. client_secret:第三方應用程序的私鑰信息,這個信息是私密的信息,不容許在OAuth2流程中傳遞的,用於安全方面的檢測和加密。

Client在取得client_id和client_secret以後再向Authorization Server發起受權請求,並獲取AccessToken,而後攜帶Token來訪問和消費受保護的資源。美圖快印要想直接獲取小李新浪微博相冊中的照片資源就須要先引導小李到新浪的登錄界面,而後完成受權登錄,而後再向受權服務器發起受權請求,而後獲取到新浪微博辦法給他的token,再攜帶者token才能訪問到微博的相冊。

下面咱們來看一下OAuth2.0的詳細受權過程:

咱們能夠看到在上述的受權過程當中最關鍵的部分是獲取token的那一步,這也是OAuth2.0的核心。有了這個token咱們就能夠訪問到resource server上的資源,ABCD這幾步都是爲了獲取這個token。

那麼這個token到底包含了哪些信息呢?咱們來從頭分析一下,咱們須要實現的是:讓美圖快印可以在不用小李用戶名和密碼的前提下訪問到小李新浪微博帳戶相冊中的特定圖片。

注意上面加粗的部分,要實現這樣的需求咱們須要從token中解析出來下面3類信息:

  1. 客戶端標識,代表是誰在請求訪問資源(美圖快印);
  2. 用戶標識,獲得了誰的許可(小李);
  3. 客戶端能訪問資源全部者的哪些資源以及其相應的權限。

有了上面的這些信息,那麼資源服務器(Resouce Server)就能夠區分出來是哪一個第三方應用(Client)要訪問哪一個用戶(Resource Owner)的哪些資源(以及有沒有權限)

在上面的流程中出現了受權許可(Authorization Grant)這個概念,那到底它是什麼意思呢?

書面解釋是:受權許但是一個表明資源全部者受權(訪問受保護資源)的憑據,客戶端用它來獲取訪問令牌。

這個解釋比較抽象,那麼咱們來翻譯一下就是:受權許但是小李授予美圖快印得到新浪微博相冊的訪問令牌的一個憑據。

那麼咱們該如何得到這個憑據吶,OAuth2定義了四種許可類型:

  1. Authorization Code:受權碼;
  2. Implicit:隱式許可;
  3. Resource Owner Password Credentials:資源全部者密碼憑據;
  4. Client Credentials :客戶端憑據。

具體每一種許可類型到底怎麼實現咱們將放到後面詳細討論,本文不作詳細解釋。

寫到最後:

   總結:OAuth2.0是一套工業級的標準受權協議,能夠很方便的解決第三方服務的受權而不須要資源全部者直接提供身份信息,它大大下降了咱們在實現認證和受權時的複雜度。目前基於OAuth2.0實現的框架有不少,基於.NET Core實現最好的是IdentityServer4

 在後續文章中咱們將一塊兒探討IdentityServer4在.NET Core中的使用,歡迎持續關注。

 若是你以爲本文寫得不錯,麻煩給個讚唄~~~

參考資料:

https://oauth.net/2/     

相關文章
相關標籤/搜索