2015-09-17 16 views
4

我正在從我的ASP.NET MVC Web應用程序通過JavaScript向我的Web API進行OAuth2調用,以對我的用戶進行身份驗證並獲取令牌。 Web API訪問使用Identity和典型的AspNetUsers表存儲用戶登錄名的SQL Server數據庫。我的API調用返回一個20分鐘的訪問令牌和一個2周的刷新令牌。 API和消費應用程序是我們正在開發的產品,我們的客戶將註冊。換句話說,所有的代碼都在我們這邊。在哪裏存儲訪問和刷新標記

我知道我必須在訪問令牌到期之前通過向API傳遞刷新令牌來刷新它。我的問題是...我在哪裏將訪問和刷新標記存儲在客戶端中,以便在JavaScript中使用以進行後續API調用或刷新令牌?網上的人都說,存儲任何客戶端是壞的,cookies不安全等,而不提供任何解決方案。本地存儲?但是,當然,這些是我們正在對API進行JavaScript處理的Ajax調用,因此令牌需要存在於客戶端的某個地方!試圖解決這個問題讓我瘋狂。我知道我需要至少使用HTTPS。

+0

嗨安迪,我正在尋找同樣的解決方案 - 在客戶端存儲訪問令牌和刷新令牌。你有這樣做的解決方案嗎? – Jenan

回答

1

我建議你在數據庫中創建一個表來存儲刷新令牌和訪問令牌。 表的結構將類似於下面

ID,ACCESS_TOKEN,Refresh_Token,LastUpdated_Time

當你調用訪問令牌的API,請檢查當前時間LastUpdated_Time令牌,如果是超過一小時您的令牌將變爲無效,因此您需要使用刷新令牌獲取另一個有效令牌。 在我的申請中,我有55分鐘的toke壽命,此後令牌無效。

代碼

if (dateTimeDiff > 55) { 
    var request = (HttpWebRequest) WebRequest.Create("https://www.googleapis.com/oauth2/v3/token"); 
    var postData = "refresh_token=your refresh token"; 
    postData += "&client_id=your client id"; 
    postData += "&client_secret=your client secret"; 
    postData += "&grant_type=refresh_token"; 

    var data = Encoding.ASCII.GetBytes(postData); 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.ContentLength = data.Length; 
    request.UseDefaultCredentials = true; 

    using(var stream = request.GetRequestStream()) { 
     stream.Write(data, 0, data.Length); 
    } 
    var response = (HttpWebResponse) request.GetResponse(); 
    string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

} 

的響應將包含新的訪問令牌,不要忘了LastUpdated_Time和新的令牌來更新表格。

0

身份驗證令牌是您始終可以使用刷新令牌獲取的內容。所以,有一個攔截器來驗證傳入和傳出的請求並將auth令牌存儲在那裏。來到刷新令牌,在我們的應用程序中,我們最初存儲在cookie中,稍後移動到本地存儲。

相關問題