IOS 中使用token機制來驗證用戶的安全性

来源:http://www.cnblogs.com/li1056822533/archive/2017/06/15/7018672.html
-Advertisement-
Play Games

登錄的業務邏輯{ http:是短連接. 伺服器如何判斷當前用戶是否登錄? // 1. 如果是即時通信類:長連接. // 如何保證伺服器跟客戶端保持長連接狀態? // "心跳包" 用來檢測用戶是否線上!用來做長連接! http:短連接使用token 機制來驗證用戶安全性 // token 值: 登錄令 ...


登錄的業務邏輯
{
    http:是短連接.
    
     伺服器如何判斷當前用戶是否登錄?
    // 1. 如果是即時通信類:長連接.
    // 如何保證伺服器跟客戶端保持長連接狀態?

    // "心跳包" 用來檢測用戶是否線上!用來做長連接!

   http:短連接使用token 機制來驗證用戶安全性


    // token 值: 登錄令牌! 用來判斷當前用戶的登錄狀態!
    // token 值特點: 是一個字元串/大整數,只需要保證唯一性.是伺服器根據用戶的信息(賬號/密碼/身份認證機制(電話        號/身份證號/支付寶賬號/銀行卡信息)...)來生成的用於標識用戶身份的值!
    // token 值獲取:
    

    // 當用戶首次登錄成功之後, 伺服器端就會生成一個 token 值. 

1.會在伺服器保存token值(保存在資料庫中) 

2.將這個token值返回給客戶端.

    // 客戶端拿到 token 值之後,一般保存在兩個位置 : 

1. 將 token 保存在 cookie 中;

2.將 token 保存在沙盒中,作為一個公共參數傳遞.

    
    // 公共參數: 每一個網路請求都需要的參數! 一般公共參數有很多都是"可選"參數!,公共參數附帶的越多,越利於後臺監測用戶,數據挖掘會使用到監測到的數據.
    
    // 以後客戶端再次發送網路請求(一般不是登錄請求)的時候,就會將這個 token 值附帶到參數中發送給伺服器.
    
    // 伺服器接收到客戶端的請求之後,會取出token值與保存在本地(資料庫)中的token值做對比!
    // 如果兩個 token 值相同 :說明用戶登錄成功過!當前用戶處於登錄狀態!
    // 如果沒有這個 token 值, 沒有登錄成功.
    // 如果 token 值不同: 說明原來的登錄信息已經失效,讓用戶重新登錄.
    
    
    // token 值失效問題: 1. token 值有失效時間!
    {
        token的有效時間:
        {
            1. 如果 app 是新聞類/游戲類/聊天類等需要長時間用戶粘性的. 一般可以設置1年的有效時間!
            
            2. 如果 app 是 支付類/銀行類的. 一般token只得有效時間比較短: 15分鐘左右!
        }
    }
    
    // token 值失效問題: 2. token 值用來做設備唯一性登錄判斷!
    {
        每次登錄之後,無論用戶密碼是否改變,只要調用登錄介面並且登錄成功,都會在伺服器生成新的token值,原來的token值就會失效!
        典型的 app : 打車軟體類
    }

    拓展: 多態設備同時登錄. 設備唯一性登錄!

       如果允許多台設備同時登錄  ,並且可以設置最大的登錄數量的時候。比如說QQ:允許在電腦客戶端登錄,QQ手機端登錄, QQ網頁端登錄

      如果超出這三個端 想要再另外 一個相同的端登錄,需要使對應的端的token失效,來保證一個端 一個賬號只登錄一次。

      可以設置多個token 根據登錄端不同 ,來檢測token 是否過期。 根據登錄的數量 可以判斷最大支持多少個設備同時登錄

}

}

 

一,OAuth2.0授權協議:

簡述:一種安全的登陸協議,用戶提交的賬戶密碼不提交到本APP,而是提交到授權伺服器,待伺服器確認後,返回本APP一個訪問令牌,本APP即可用該訪問令牌訪問資源伺服器的資源。由於用戶的賬號密碼並不與本APP直接交互,而是與官方伺服器交互,因而它是安全的。

圖示:

 

 

流程:

  1,獲取未授權的Request Token。

    url:request token url。

    param:appKey/appSecret,簽名方法/簽名(如HMAC-SHA1),timeStamp(時間戳:距1970/0/0/0/0/0的秒數),nonce(隨機生成的string,防止重覆請求)

    response:Oauth_Token/Oauth_Secret

  2,獲取用戶授權的Request Token。

    url:user authorizition url。

    param:Oauth_Token(上個步驟返回的令牌),callback_url(授權成功後返回的地址)

    response:Oauth_Token(被用戶授權或否決的令牌)

  3,用已授權的Request Token換取AccessToken。

    url:access token url。

    param:appKey,Oauth_Token(上個步驟返回的令牌),簽名,TimeStamp,nonce

    response:Access_Token/Secret

二,新浪微博的implementation(以iOS sdk為例)。

  1,先封裝下列參數:

      NSDictionary *params = [NSMutableDictionarydictionaryWithObjectsAndKeys:

                                    self.appKey, @"client_id",

                                    @"code", @"response_type",

                                    self.appRedirectURI, @"redirect_uri",

                                    @"mobile", @"display", nil];

      appKey和AppSecret在申請第三方APP的時候即可得到。appRedirectURI只對網頁應用有效,所以這裡可以隨便填一個或者使用預設的。

      response_type為code錶面其希望返回的是一個授權碼(相當於上述的未授權的Request Token)。

      display應該是指該請求是移動app的請求。

    然後啟動一個WebView,請求url:https://open.weibo.cn/2/oauth2/authorize,帶上述參數,方法為get。

    形成的url如:https://open.weibo.cn/2/oauth2/authorize?client_id=1213792051&response_type=code&

           redirect_uri=https%3A%2F%2Fapi.weibo.com%2Foauth2%2Fdefault.html&display=mobile

    接著就進入了要求輸入賬號密碼的頁面

    輸入賬號密碼後,以post方式往https://open.weibo.cn/2/oauth2/authorize發送請求

    出現授權或請求的按鈕,至此完成第一部分。

    疑問:協議中的未授權的request token在這裡是哪個實體?還是新浪把它弱化掉了,也可能是緩存在webview中。

  2,點擊授權按鈕之後,就可以得到Authorization Code了,該授權碼相當於以授權的Request Token。

  3,封裝參數

      NSDictionary *params = [NSDictionarydictionaryWithObjectsAndKeys:

                            self.appKey, @"client_id",

                            self.appSecret, @"client_secret",

                            @"authorization_code", @"grant_type",

                            self.appRedirectURI, @"redirect_uri",

                            code, @"code", nil];
     請求url:https://open.weibo.cn/2/oauth2/access_token,方法post,加上述參數,通過NSURLConnection發送請求

     返回的data就包含access token,當然會判斷下該token是否還合法,有效,過期,成功的話會save住下麵4個欄位。

      NSString *access_token = [authInfo objectForKey:@"access_token"];

        NSString *uid = [authInfo objectForKey:@"uid"];

        NSString *remind_in = [authInfo objectForKey:@"remind_in"];

        NSString *refresh_token = [authInfo objectForKey:@"refresh_token"];

   4,以後在請求資源時,就會加上access_token了。

三,SSO技術。

  簡述:SSO全場Single Sign On,用戶只需登陸一次即可訪問相互信任的子系統。用戶訪問系統1時,登陸成功後會返回一個ticket,當用戶訪問系統2時,會把ticket帶上,待驗證合法後即可訪問系統2。聽起來跟cookie有點像,沒錯,Web-SSO便有基於cookie的實現方案。很多手機APP在點擊新浪授權時,會跳到新浪客戶端的登陸頁面,這裡就用到SSO技術啦。

  在本APP授權新浪微博時,會先檢測手機是否安裝了新浪微博客戶端。

  [[UIApplicationsharedApplication] openURL:xxx]可以打開另一個APP。這裡sinaweibosso://login為客戶端的url並傳遞三個參數,AppKey,RedirectURI,ssoCallbackScheme。

  ssoCallbackScheme是返回的App Url地址,即自己定義的sinaweibosso.appKey。

  登陸成功後,客戶端會直接把AccessToken返回給本App。至於在客戶端那邊發生了哪些交互,暫時不得而知。  

、、本文轉自      http://blog.csdn.net/yyacheng/article/details/52638318


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • XMPP詳解 XMPP(eXtensible Messaging and Presence Protocol,可擴展消息處理和現場協議)是一種在兩個地點間傳遞小型結構化數據的協議。在此基礎上,XMPP協議已經被用來構建大規模即時通信系統、游戲平臺、協作空間及語音和視頻會議系統。 XMPP由幾個小的構 ...
  • 一、用戶登錄流程 用戶登錄流程.png 註意:XMPP核心文件,基於TCP的XML流的傳輸,XMPPFrame框架是通過代理的方式實現消息傳遞的 實現用戶登錄的步驟如下: 1、實例化XMPPStream並設置代理,同時添加代理到工作隊列 2、使用JID連接至伺服器,預設埠為5222,JID字元串中 ...
  • 項目.xcodeproj 文件夾底下一般有4個文件: project.pbxproj 文件 xcuserdata 文件夾 xcshareddata 文件夾 project.xcworkspace 文件夾 (這裡暫不講解) 下麵主要講解涉及到 .xcschemes 相關文件,其他設置(例如斷點一類的) ...
  • 一,效果圖。 二,代碼。 RootViewController.h RootViewController.m ...
  • 先看效果: 使用ListView的ItemTemplateSelector 1、定義一個 HomeTemplateSelector繼承DataTemplateSelector, 並定義兩個數據模板AdTemplate,NewsTemplate,代碼如下 1 public class HomeData ...
  • KVO
    1.KVO概念 KVO即鍵值觀察,它提供一種機制,當被觀察的對象的屬性發生改變後,對象會接收到通知,從而做出相應的改變。 2.KVO實現原理 這裡要說一個isa指針,在Objective-C中,任何類的定義都是對象。類和類的實例(對象)沒有任何本質上的區別。任何對象都有isa指針。 那麼什麼是類呢? ...
  • 最近做項目要求使用到網路,想來想去選擇了AsyncHttpClient框架開進行APP開發。在這裡把我工作期間遇到的問題以及對AsyncHttpClient的使用經驗做出相應總結,希望能對您的學習有所幫助。 首先按照慣例先來簡單瞭解一些AsyncHttpClient網路框架的一些知識。 1、簡介 A ...
  • description 在開發過程中, 往往會有很多的model來裝載屬性. 而在開發期間經常會進行調試查看model里的屬性值是否正確. 那麼問題來了, 在objective-c里使用NSLog("%@",model)這行代碼列印出來的卻是model的地址. 不是我們所想要的結果~! 看圖: 那麼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...