Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 存储访问和刷新令牌的位置_Javascript_Asp.net_Cookies_Oauth 2.0 - Fatal编程技术网

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

Javascript 存储访问和刷新令牌的位置,javascript,asp.net,cookies,oauth-2.0,Javascript,Asp.net,Cookies,Oauth 2.0,我正在通过JavaScript从我的ASP.NET MVC web应用程序调用OAuth2到我的web API,以验证我的用户并获取令牌。Web API访问SQL Server数据库,在该数据库中使用Identity和典型的AspNetUsers表存储用户登录名。我的API调用返回一个20分钟的访问令牌和一个2周的刷新令牌。API和消费应用程序是我们正在开发的产品,我们的客户将在其中注册。换句话说,所有代码都站在我们这边 我知道我必须在访问令牌过期之前通过向API传递刷新令牌来刷新它。我的问题是

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


我知道我必须在访问令牌过期之前通过向API传递刷新令牌来刷新它。我的问题是…我应该将访问和刷新令牌存储在客户机的何处,以便在JavaScript中用于后续API调用或刷新令牌?人们在网上说,在客户端存储任何东西都是不好的,cookies是不安全的,等等,而且没有提供任何解决方案。本地存储?当然,这些都是JavaScript中的Ajax调用,我们正在对API进行调用,因此令牌需要存在于客户端的某个位置!想弄明白这件事真让我抓狂。我知道我至少需要使用HTTPS。

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

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

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

无论何时使用访问令牌调用API,请检查令牌的当前时间上次更新时间,如果超过一小时,您的令牌将无效,因此您需要使用刷新令牌获取另一个有效令牌。 在我的应用程序中,我有55分钟的toke寿命,在此时间之后,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\u Time
和新令牌更新您的表。

嗨,Andy,我正在寻找相同的解决方案-在客户端哪里存储访问令牌和刷新令牌。您有这样做的解决方案吗?我想问题是在哪里存储客户端的访问令牌。您建议将它们存储在数据库中,但是如何再次从数据库中获取访问令牌以使用授权标头进行api调用?请澄清。谢谢