使用token機制來驗證用戶的安全性-b

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

    // "心跳包" 用來檢測用戶是否在線!用來作長鏈接!ios

 

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

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

    // 當用戶首次登陸成功以後, 服務器端就會生成一個 token 值. api

1.會在服務器保存token值(保存在數據庫中) 緩存

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

    

    // 客戶端拿到 token 值以後,通常保存在兩個位置 : 服務器

1. 將 token 保存在 cookie 中;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。至於在客戶端那邊發生了哪些交互,暫時不得而知。  

相關文章
相關標籤/搜索