javascript - 在哪里存储访问和刷新 token

标签 javascript asp.net cookies oauth-2.0

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

我知道我必须通过将刷新 token 传递给 API 来在访问 token 过期之前刷新它。我的问题是......我应该将访问和刷新 token 存储在客户端的什么位置,以便在我的 JavaScript 中进行后续 API 调用或刷新 token ?网上的人说在客户端存储任何东西都是不好的,cookie 是不安全的,等等,但没有提供任何解决方案。本地存储?但当然,这些是我们对 API 进行的 JavaScript 中的 Ajax 调用,因此 token 需要存在于客户端的某个位置!试图弄清楚这一点让我发疯。我知道我至少需要使用 HTTPS。

最佳答案

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

ID,Access_Token,Refresh_Token,LastUpdated_Time

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

代码

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();

}

响应将包含新的访问 token ,不要忘记使用 LastUpdated_Time 和新 token 更新您的表。

关于javascript - 在哪里存储访问和刷新 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32631892/

相关文章:

javascript - HTML5 纸牌游戏

asp.net - IHttpActionResult - 如何使用?

jquery - jQ/UI 升级后无法使 jQ UI 选项卡与 cookie 一起工作

javascript - v-html中组件的使用方法

javascript - 使用 Mongoose 在 MongoDB 中按聚合层次进行 $match

javascript - 如何从NodeJS中的静态页面访问index.js

javascript - 如何在javascript中将字符串的第一个字母大写?

asp.net - 具有不同参数类型的 MVC3 路由

asp.net - 在ASP.NET MVC C#中使用Cookie

javascript - 单击链接调用 javascript 函数