在哪里存储访问和刷新令牌

And*_*ndy 5 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 不安全等等,但没有提供任何解决方案。本地存储?当然,这些是我们对 API 进行的 JavaScript 中的 Ajax 调用,因此令牌需要存在于客户端的某个位置!试图弄清楚这一点让我发疯。我知道我至少需要使用 HTTPS。

Aha*_*iPK 1

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

ID、访问令牌、刷新令牌、上次更新时间

每当您使用 access token 调用 API 时,请检查当前时间和token 的LastUpdated_Time,如果超过一小时,您的 token 将失效,因此您需要使用刷新 token 获取另一个有效 token。在我的应用程序中,令牌的有效期为 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();

}
Run Code Online (Sandbox Code Playgroud)

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