折騰了兩天終於將快盤的 Oauth授權機制搞清楚了,並成功的獲取了授權用戶的信息以及文件夾的信息.
記錄下開發經過,方便后來人.
先上圖:
1..net 下的時間戳的獲取.
2.Hmac_Sha1加密算法
3.Urlencode 算法
4.參數的排序
5.上一個demo信息
以上三個算法是.net 下成功調用快盤API的核心,稍有差異便調用失敗.一下是開發經過.
1 時間戳的獲取,要將將系統時間轉換成UNIX時間戳 ,.net 的 DateTime.Now.Ticks 不行.必須要轉化,時間戳是10位的.下面上代碼.
/// <summary>
/// 獲取時間戳
/// </summary>
/// <returns></returns>
private string GetTimeStamp() {
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
DateTime dtNow = DateTime.Parse(DateTime.Now.ToString());
TimeSpan toNow = dtNow.Subtract(dtStart);
string timeStamp = toNow.Ticks.ToString();
timeStamp = timeStamp.Substring(0, timeStamp.Length - 7);
return timeStamp;
}
2.Hmac_Sha1 算法.
.net 下可以用System.Security.Cryptography.HMACSHA1 這個類進行轉化.但是這個類計算的結果是 一個字節數組,要用base64 才能轉成為字符串.因此后面簽名里的 base64 就可以不用了,否則兩次base64會出現簽名失敗的情況.
private string Hmac_Sha1AndBase64(string Source,string SecretKey){
System.Security.Cryptography.HMACSHA1 hmacsha1 = new System.Security.Cryptography.HMACSHA1();
hmacsha1.Key = System.Text.Encoding.ASCII.GetBytes(SecretKey);
byte[] dataBuffer = System.Text.Encoding.ASCII.GetBytes(Source); //signatureBase要進行簽名的基礎字符串
byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);
return Convert.ToBase64String(hashBytes);
}
3.Urlencode 算法.
這個算法折騰的時間最長,用HttpUtility.UrlEncode() 不行,因為快盤的urlencode算法比較特殊.規則是:
urlencode編碼的字符需要用utf8轉編碼,16進制部分需要大寫,如等號”=”是%3D而不是%3d;
urlencode規則:只有字母數字和[.-_~](紅色部分,不包括方括號)不用encode,其他字符都需要,例如urlencode(".-_~+*")=".-_~%20%2B%2A"
因此老老實實的將這個算法用c#重新寫了一遍.
將字符串轉化為字節數組后,每個字符的asicii 碼規則應該大家都熟悉;
這里再描述下:
0-9 對應的asicii 為 48-57
a-z 對應的asicii 為 97-122
A-z對應 65-90
46,45,95,126 分別對應.-_~
因此該算法出來了:
private string UrlEncode(string str){
StringBuilder sb = new StringBuilder();
byte[] byStr = System.Text.Encoding.UTF8.GetBytes(str); //默認是System.Text.Encoding.Default.GetBytes(str)
for (int i = 0; i < byStr.Length; i++)
{
if ((byStr[i] >= 48 && byStr[i] <= 57)
|| (byStr[i] >= 97 && byStr[i] <= 122)
|| (byStr[i] >= 65 && byStr[i] <= 90)
|| (byStr[i] == 46)
|| byStr[i] == 45
|| byStr[i] == 95
|| byStr[i] == 126
)
{
sb.Append((char)byStr[i]);
}
else
{
string t = Convert.ToString(byStr[i], 16);
sb.AppendFormat(@"%{0}", t.ToUpper());
}
}
return sb.ToString();
}
4.參數排序.
.net 里面 Dictionary 是按照添加元素的先后進行排序的.與快盤要求的字典數序不一致.
因此找到 SortedDictionary,該集合是按照字典順序進行排序的,而不是按照添加的順序進行的.
5.上面的核心算法有了,那么前三步的授權就輕易的獲取到了,Account_Info,Metadata 也就能很容易的獲取到了.
整個授權的流程個人理解就是:
第一步先取一個臨時的 token
第二步根據臨時的token 讓用戶登錄獲取授權.
第三步 根據臨時的token 和oauth_token_secret 獲取真正的 token 和oauth_token_secret
后面的Account_info,Meatdata 用到的token和 oauth_token_secret 其實就是第三步獲取到的真正的token.
好了.基本分享完畢!
歡迎拍磚!
找不到上傳附件的地方,因此將發表在快盤論壇的帖子地址附上,上面有demo下載地址.
http://bbs.kuaipan.cn/viewthread.php?tid=21479&page=1&extra=