存储访问和刷新令牌的位置

时间:2015-09-17 13:44:18

标签: javascript asp.net cookies oauth-2.0

我正在通过JavaScript从我的ASP.NET MVC Web应用程序到我的Web API进行OAuth2调用,以验证我的用户并获取令牌。 Web API访问SQL Server数据库,其中使用Identity和典型的AspNetUsers表存储用户的登录名。我的API调用返回20分钟访问令牌和2周刷新令牌。 API和消费应用程序是我们正在开发的产品,我们的客户将注册。换句话说,所有代码都在我们这边。

我知道我必须通过传递API刷新令牌来在访问令牌到期之前刷新它。我的问题是......我在哪里存储访问权限并刷新令牌以便在我的JavaScript中使用以进行后续API调用或刷新令牌?网上的人都说存储客户端的任何东西都是坏的,cookie是不安全的,等等,而且没有提供任何解决方案。本地存储?但是当然这些是JavaScript中的Ajax调用,因此令牌需要存在于客户端的某个地方!这让我疯狂,试图解决这个问题。我知道我至少需要使用HTTPS。

2 个答案:

答案 0 :(得分:1)

我建议您在数据库中创建一个表来存储刷新令牌和访问令牌。 表结构如下所示

ID,ACCESS_TOKEN,Refresh_Token,LastUpdated_Time

每当您使用访问令牌调用API时,请检查令牌的当前时间 LastUpdated_Time ,如果令牌超过一小时,您的令牌将会超过一小时变为无效,因此您需要使用刷新令牌获取另一个有效令牌。 在我的应用程序中,我有55分钟的生命周期,之后令牌失效。

<强>代码

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和新令牌更新您的表格。

答案 1 :(得分:0)

使用刷新令牌可以始终获取身份验证令牌。因此,有一个拦截器验证传入和传出的请求并在那里存储auth-token。来到刷新令牌,在我们的应用程序中,我们最初存储在cookie中,稍后移动到本地存储。