我找不到任何使用DotNetOpenAuth的例子來刷新過期的訪問令牌。大多數提供商不使用過期令牌,但雅虎是一個在一個小時內過期令牌的大型提供商。DotNetOpenAuth是否支持刷新過期訪問令牌?
謝謝!
我找不到任何使用DotNetOpenAuth的例子來刷新過期的訪問令牌。大多數提供商不使用過期令牌,但雅虎是一個在一個小時內過期令牌的大型提供商。DotNetOpenAuth是否支持刷新過期訪問令牌?
謝謝!
雅虎確實使用OAuth 1.0,所以我想出如何做手工:
首先,我嘗試使用我救了我的數據庫中的令牌。如果我得到401未授權錯誤,我打電話給我的RefreshYahooAccessToken()方法,然後重試。
注意:我有自己的TokenManager實現,它將我的訪問令牌存儲在數據庫中,以及任何與在Yahoo的get_token Response Parameters中給我的令牌(YahooGUID和oauth_session_handle)關聯的額外數據,但是您可以輕鬆修改它以使用不同的TokenManager實現。
這是我的工作版本:
try
{
request = yahoo.PrepareAuthorizedRequest(YahooContactsAPIEndpoint, TokenManager.currentToken.Token, extraData);
response = yahoo.Channel.WebRequestHandler.GetResponse(request);
body = response.GetResponseReader().ReadToEnd();
}
catch (DotNetOpenAuth.Messaging.ProtocolException ex)
{
//is token expired?
if (ex.InnerException is WebException
&& ((WebException)ex.InnerException).Response is HttpWebResponse
&& ((HttpWebResponse)((WebException)ex.InnerException).Response).StatusCode == HttpStatusCode.Unauthorized)
{
RefreshYahooAccessToken();
request = yahoo.PrepareAuthorizedRequest(YahooContactsAPIEndpoint, TokenManager.currentToken.Token, extraData);
response = yahoo.Channel.WebRequestHandler.GetResponse(request);
body = response.GetResponseReader().ReadToEnd();
}
}
private static void RefreshYahooAccessToken()
{
var request = (HttpWebRequest)WebRequest
.Create("https://api.login.yahoo.com/oauth/v2/get_token"
+ "?oauth_consumer_key=" + TokenManager.ConsumerKey
+ "&oauth_nonce=" + (new Random()).Next(123400, 9999999).ToString()
+ "&oauth_session_handle=" + TokenManager.GetExtraData("oauth_session_handle") //this value is given to you in the get_token Response Parameters
+ "&oauth_signature=" + TokenManager.ConsumerSecret + "%26" + TokenManager.currentToken.Secret
+ "&oauth_signature_method=PLAINTEXT"
+ "&oauth_timestamp=" + (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds.ToString().Split(new char[] { '.' })[0]
+ "&oauth_token=" + TokenManager.currentToken.Token
+ "&oauth_version=1.0");
try
{
var response = (HttpWebResponse)request.GetResponse();
var returnStr = new System.IO.StreamReader(response.GetResponseStream()).ReadToEnd();
var returnData = System.Web.HttpUtility.ParseQueryString(returnStr ?? string.Empty);
TokenManager.ExpireRequestTokenAndStoreNewAccessToken(null, null, returnData["oauth_token"], returnData["oauth_token_secret"]);
}
catch (Exception)
{
//User probably revoked token. Clear the current token, and request authorization again
}
}
如果你在談論OAuth 1.0(a),我不認爲續訂過期的訪問令牌是規範的一部分,所以我懷疑你不能這樣做,無論你使用的OAuth庫如何。
如果您在談論OAuth 2.0,那麼是的ClientBase.RefreshToken
方法將爲您做到這一點。當您撥打ClientBase.AuthorizeRequest
時,DotNetOpenAuth甚至會自動更新將近過期的令牌。