【问题标题】:Where to store Access and Refresh tokens访问和刷新令牌的存储位置
【发布时间】:2015-12-14 09:57:37
【问题描述】:

我正在通过 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。

【问题讨论】:

  • 嗨,安迪,我正在寻找相同的解决方案 - 在客户端存储访问令牌和刷新令牌的位置。你有解决办法吗?

标签: javascript asp.net cookies oauth-2.0


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我认为问题是关于从客户端存储访问令牌的位置。您建议将它们存储在数据库中,但是如何再次从数据库中获取访问令牌以使用授权标头进行 api 调用?请说清楚。谢谢。
    猜你喜欢
    • 2019-10-25
    • 2015-12-13
    • 2021-07-16
    • 2021-09-13
    • 2021-07-08
    • 2020-01-26
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多