【问题标题】:How to get access token from refresh token google in asp.net如何从 asp.net 中的刷新令牌谷歌获取访问令牌
【发布时间】:2013-12-26 16:38:25
【问题描述】:
如何在 asp.net 中从刷新令牌谷歌获取访问令牌?
您不应该根据特定的生命周期来设计应用程序
访问令牌。假设它们(非常)短命。
但是,在成功完成 OAuth2 安装之后
应用程序流,您将获得一个刷新令牌。本次刷新
令牌永不过期,您可以使用它来交换访问权限
令牌根据需要。保存刷新令牌,并使用它们获取访问权限
按需令牌(然后应立即用于获取访问权限
到用户数据)。
【问题讨论】:
-
Save the refresh tokens, and use them to get access tokens on-demand (which should then immediately be used to get access to user data。如果你好奇,你可以探索为它编写你的库。否则,请避免重新发明轮子并使用available libraries
标签:
asp.net
asp.net-mvc-4
google-api
【解决方案1】:
private bool GetNewAccessToken(GoogleTokenModel GoogleTokenModelObj)
{
try
{
string Url = "https://accounts.google.com/o/oauth2/token";
string grant_type = "refresh_token";
string redirect_uri_encode = UrlEncodeForGoogle(ReturnUrl);
string data = "client_id={0}&client_secret={1}&refresh_token={2}&grant_type={3}";
HttpWebRequest request = HttpWebRequest.Create(Url) as HttpWebRequest;
string result = null;
request.Method = "POST";
request.KeepAlive = true;
request.ContentType = "application/x-www-form-urlencoded";
string param = string.Format(data, ClientID, ClientSecret, GoogleTokenModelObj.Refresh_Token, grant_type);
var bs = Encoding.UTF8.GetBytes(param);
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse response = request.GetResponse())
{
var sr = new StreamReader(response.GetResponseStream());
result = sr.ReadToEnd();
sr.Close();
}
var jsonSerializer = new JavaScriptSerializer();
var TokenData = jsonSerializer.Deserialize<GoogleTokenModel>(result);
GoogleTokenModelObj.Access_Token = TokenData.Access_Token;
if (TokenData.Refresh_Token != null)
GoogleTokenModelObj.Refresh_Token = TokenData.Refresh_Token;
//GoogleTokenModelObj.LastAccessDateTime = DateTime.Now;
//Update the refresh and access token in DB for next login usage
//GoogleCalendarManager.UpdateRefreshTokenInGoogleAppointmentOAuth(GoogleTokenModelObj);
XmlDocument XmlDoc = new XmlDocument();
XmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "App_Data\\XMLfile.xml");
XmlDoc.DocumentElement.SelectSingleNode("//User[@UserID='1']").Attributes["AccessToken"].Value = TokenData.Access_Token;
XmlDoc.DocumentElement.SelectSingleNode("//User[@UserID='1']").Attributes["RefreshToken"].Value = TokenData.Refresh_Token;
XmlDoc.Save(AppDomain.CurrentDomain.BaseDirectory + "App_Data\\XMLfile.xml");
return true;
}
catch
{
return false;
}
}