天天看點

WebApi後端架構Token身份認證,Api接口Token驗證

WebApi後端架構Token身份認證,Api接口Token驗證

令牌概述(Token)     在以使用者賬号體系作為安全認證的資訊系統中,對使用者身份的鑒定是非常重要的事情。   令牌機制是軟體系統安全體系中非常重要的部分,在計算機身份認證中是令牌的意思,一般作為邀請、登入以及安全認證使用。Token其實說的通俗點就是“暗号”,在一些資料傳輸之前,要先進行暗号的核對,不同的暗号被授權不同的資料操作。   随着網際網路行業快速的發展逐漸的演變成了前後端分離,若項目中需要做登入的話,那麼token成為前後端唯一的一個憑證。Token最大的特點是系統臨時配置設定的一組資料,可以設定過期時間,可以追蹤令牌使用過程,可以通過令牌控制使用者禁止或允許使用業務系統。   随着移動網際網路時代到來,用戶端的類型越來越多,逐漸出現了一個伺服器對應N個用戶端的格局。     WebApi服務端與用戶端應用     下圖是CSFramework.WebApi開發架構的前後端應用場景。  

WebApi後端架構Token身份認證,Api接口Token驗證

不同的用戶端産生了不同的使用者使用場景,有如下幾種常用場景:  

1. 不同的環境安全威脅;   2. 不同的會話生存周期;   3. 不同的使用者權限控制體系;   4. 不同級别的接口調用方式;

  綜上所述,它們的身份認證方式也存在一定的差別,本文将使用一定的篇幅對這些場景進行一些分析和梳理工作。     Token機制适用的場景     在軟體設計與開發方面,下面總結了幾種應用場景:  

1. 使用者在Winform系統,如C/S架構的用戶端登入系統,使用系統服務;   2. 使用者在web浏覽器端登入系統,使用系統服務;   3. 使用者在手機端(Android/iOS)登入系統,使用系統服務;   4. 使用者使用開放接口登入系統,調用系統服務;   5. 使用者在PC處理登入狀态時通過手機掃碼授權手機登入(使用得比較少);   6. 使用者在手機處理登入狀态進通過手機掃碼授權PC進行登入(比較常見);

    Token類别   通過對場景的細分,得到如下不同的認證token類别:  

1.原始賬号密碼類别   2.使用者名和密碼   3.API應用ID/KEY   4.會話ID類别   5.浏覽器端token   6.移動端token   7.API應用token   8.接口調用類别   9.接口通路token   10.身份授權類别   11.PC和移動端互相授權的token  

  Token的安全性和隐私性:   Token 不容易被竊取和盜用(Token動态生成并通過對傳送頻率控制) Token 即使被竊取,産生的影響也是可控的(通過對有效時間控制、使用者控制)     關于隐私及隐私破壞後的後果,有如下的基本結論:   1. 曝光頻率高的容易被截獲;   2. 生存周期長的被截獲後對系統安全産生非常大的影響,更嚴重和不容易察覺;     應遵守如下原則杜絕Token被洩露和竊取:   1. 變化成本高的token不要輕易變化; 2. 不輕易變化的token要減少曝光頻率(網絡傳輸次數); 3. 曝光頻率高的token的生存周期要盡量短;     Token量化名額及分類:

WebApi後端架構Token身份認證,Api接口Token驗證

備注:    user_name/password 與 api_key/secret_key 是等價的效果。   user_name/password用于内部系統登入。 api_key/secret_key用于WebApi架構下的開發者賬号和密碼。     Token層級關系   參考上面的分類表,很容易對這些不同用途的token進行分層,主要分為以下4層:   密碼層:最傳統的使用者和系統之間約定的數字身份認證方式。   會話層:使用者登入後的會話生命周期的會話認證。   調用層:使用者在會話期間對應用程式接口的調用認證。   應用層:使用者擷取了接口通路調用權限後的一些場景或者身份認證應用。   Token的分層圖如下:

WebApi後端架構Token身份認證,Api接口Token驗證

在多用戶端的軟體系統裡,Token的産生及應用的内在聯系如下:   1. 使用者輸入使用者名和使用者密碼進行一次性認證; 2. 在不同的終端裡面生成擁有不同生命周期的會話token; 3. 用戶端會話token從服務端交換生命周期短但曝光 頻繁 的接口通路token; 4. 會話token可以生成和重新整理延長 access_token 的生存時間; 5. access_token可以生成生存周期最短的用于授權的二維碼的token;     密碼層:賬号密碼 (user_name/password)   賬号/密碼是指注冊使用者名和密碼、應用程式的api_key/secret_key。   它們的特點有:   1. 使用者自己為了友善記憶,會設定有一定含義的賬号和密碼。   2. 不常修改,賬号密碼對使用者有特别含義,一般沒有特殊情況不會願意修改。 而api_key/secret_key則會寫在應用程式中,修改會意味着重新釋出上線的成本   3. 一旦洩露影響深遠,正因為不常修改,隻要洩露了基本相當于使用者的網絡身份被洩露,而且隻要沒被察覺這種身份盜用就會一直存在,是以在認證系統中應該盡量減少傳輸的機會,避免洩露。     回話層:用戶端會話token   充當着session的角色,不同的用戶端有不同的生命周期。   使用者使用賬号和密碼登入系統,換取會話token。   Web平台的Token生存周期短。由于Web登入環境一般很可能是公共環境,被他人盜取的風險值較大。Web平台的用戶端主要是指網頁,容易被破解源碼。   移動端生存周期長。移動端平台是個人使用者極其私密的平台,它人接觸的機會不大。移動端如APP,軟體是可以加殼保護源碼,不易被破解,是以不易被洩露。     調用層:接口存取access_token     access_token是指服務端應用程式api接口通路和調用的憑證。   使用具有較長生命周期的會話token來換取此接口通路token。比如使用user_name/password或api_key/secret_key擷取access_token。   其曝光頻率直接和接口調用頻率有關,屬于高頻使用的憑證。為了照顧到隐私性,盡量減少其生命周期,即使被截取了,也不至于産生嚴重的後果。   注意:在用戶端token之下還加上一個access_token, 主要是為了讓具有不同生命周期的用戶端token最後在調用api的時候, 能夠具有統一的認證方式。   備注:常用系統使用回話層Token即可滿足需求,增加一層access_token用于特殊應用環境。     應用層:pam_token   由已經登入和認證的PC端生成的二維碼的原始串号(PC Auth Mobile)。   主要步驟如下:   1. PC上使用者已經完成認證,登入了系統; 2. PC端生成一組和此使用者相關聯的pam_token 3. PC端将此pam_token的使用連結生成二維碼 4. 移動端掃碼後,請求伺服器,并和使用者資訊關聯 5. 移動端擷取refresh_token(長時效的會話) 6. 根據 refresh_token 擷取 access_token 7. 完成正常的接口調用工作     備注:   1. 生存周期為2分鐘,2分鐘後過期删除 2. 沒有被使用時,每1分鐘變一次 3. 被使用後,立刻删除掉 4. 此種認證模式一般不會被使用到     應用層:map_token     由已經登入的移動app來掃碼認證PC端系統,并完成PC端系統的登入(Mobile Auth PC)。   主要步驟:   1. 移動端完成使用者身份的認證登入app 2. 未登入的PC生成匿名的 map_token 3. 移動端掃碼後在db中生成 map_token 和使用者關聯(完成簽名) 4. db同時針對此使用者生成 web_token 5. PC端一直以 map_token 為參數查找此命名使用者的 web_token 6. PC端根據 web_token 去擷取 access_token 7. 後續正常的調用接口調用工作     備注:   1. 生存周期為2分鐘,2分鐘後過期删除 2. 沒有被使用時,每1分鐘變一次 3. 被使用後,立刻删除掉     在應用中可以适用于且不限于如下場景   1. 使用者登入

2. 有時效的優惠券發放

3. 有時效的邀請碼發放

4. 有時效的二維碼授權

5. 具有時效 手機/郵件 驗證碼

6. 多個不同平台調用同一套API接口 7. 多個平台使用同一個身份認證中心     Token身份認證/W ebapi token驗證   主要是檢查目前使用者的Token是否有效,包括以下幾種狀态:    1.令牌不存在,2.令牌過期,3.令牌不同,異地使用者登入(或相同使用者重新登入)   驗證失敗WebApi伺服器抛出ResponseException異常。  

C# Code:

/// <summary>
/// 檢查目前使用者的Token: 1.令牌不存在,2.令牌過期,3.令牌不同,異地使用者登入(或相同使用者重新登入)
/// 驗證失敗抛出ResponseException異常.
/// </summary>
/// <param name="userID">使用者編号,使用者系統賬号</param>
/// <param name="token">使用者令牌</param>
public static void CheckToken(string userID, string token)
{
  if (String.IsNullOrEmpty(userID) || String.IsNullOrEmpty(token))
  throw new ResponseException(ErrorCodes.JsonFormatInvalide, ErrorCodes.JsonFormatInvalide_Msg);
  
  //重點!!!必須使用賬戶判斷令牌!!!
  //傳回null表示過期或使用者不存在
     ModelTokenUser tokenUser = TokenProvider.GetTokenByAccount(userID);
  
  //無令牌
     if (tokenUser == null)
  throw new ResponseException(ErrorCodes.TokenExpired, ErrorCodes.TokenExpired_Msg);
  
  //令牌不同,異地有使用者登入
     if (tokenUser.Token != token)
  throw new ResponseException(ErrorCodes.TokenDuplicateLogin, ErrorCodes.TokenDuplicateLogin_MSG);
}
           

令牌管理器(Token Provider)   http://www.csframework.com/archive/1/arc-1-20200402-2840.htm

C# Code:

/// <summary>
/// 根據系統登入賬号擷取token
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
public static ModelTokenUser GetTokenByAccount(string account)
{
  if (String.IsNullOrEmpty(account))
  return null;
  else
  {
    return _data.Where(p => p.Value.Account.ToLower() == account.ToLower()).FirstOrDefault().Value;
  }
}
           

ModelTokenUser類:

C# Code:

/// <summary>
/// 使用者令牌資料模型
/// </summary>
public class ModelTokenUser
{
  /// <summary>
  /// 使用者編号,或APP系統唯一賬号(對應手機号碼)
  /// </summary>
     public string Account { get; set; }
  
  /// <summary>
  /// 令牌
  /// </summary>
     public string Token { get; set; }
  
  /// <summary>
  /// 手機号碼
  /// </summary>
     public string Phone { get; set; }
  
  /// <summary>
  /// 用戶端資訊
  /// </summary>
     public string Client { get; set; }
  
  /// <summary>
  /// 版本
  /// </summary>
     public string Version { get; set; }
  
  /// <summary>
  /// 裝置編碼
  /// </summary>
     public string MID { get; set; }
  
  /// <summary>
  /// 生成Token時間
  /// </summary>
     public DateTime TS { get; set; }
  
  /// <summary>
  /// 過期時間
  /// </summary>
     public int TokenExpires { get; set; }
}
           

WebApi Token相關參考文章:     基于Web前端使用者調用CSFramework.WebApi服務端登入登出接口實作 http://www.csframework.com/archive/1/arc-1-20200402-2841.htm   CSFramework.WebApi令牌管理器(Token Provider)實作添加、删除、重新整理令牌過期控制 http://www.csframework.com/archive/1/arc-1-20200402-2840.htm     CSFramework.WebApi後端伺服器架構:用戶端調用WebApi接口方式(簽名+Token令牌) http://www.csframework.com/archive/1/arc-1-20200402-2839.htm     CSFramework.WebApi開發架構模拟Web使用者端登入、調用WebApi接口增删改查資料 http://www.csframework.com/archive/1/arc-1-20200403-2842.htm     CSFramework.WebApi後端架構Token令牌工作機制以及Token重新整理原理 http://www.csframework.com/archive/1/arc-1-20200401-2830.htm     WebApi開發架構:Token生成、Token緩存原理、Token驗證、令牌機制與原理 http://www.csframework.com/archive/1/arc-1-20200403-2843.htm