幾乎所有 SNS 網站都需要「邀請站外好友」功能。本文實戰示範如何整合 Windows Live (MSN) OAuth 流程:使用者輸入帳密 → 程式代為向 Live ID 服務申請 Token → 取得聯絡人清單 → 發送邀請 Email。附完整截圖流程與關鍵程式碼片段,同理可擴展至 Gmail、Yahoo、Facebook 等提供商。
https://login.live.com 發送認證請求 (含 Action=Login, CredType=1 等參數)。MBI_KEY, TicketToken)。https://social.msdn.microsoft.com/.../Contacts (或對應 API 端點) 取得聯絡人 XML/JSON。public string GetLiveTicket(string username, string password)
{
string postData = $"Action=Login&CredType=1&LoginOptions=3&UserName={HttpUtility.UrlEncode(username)}&Password={HttpUtility.UrlEncode(password)}";
byte[] data = Encoding.UTF8.GetBytes(postData);
var req = (HttpWebRequest)WebRequest.Create("https://login.live.com/ppsecure/post.srf");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = data.Length;
req.CookieContainer = new CookieContainer();
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)";
using (var stream = req.GetRequestStream()) stream.Write(data, 0, data.Length);
using (var resp = (HttpWebResponse)req.GetResponse())
using (var reader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
{
string html = reader.ReadToEnd();
// 解析 HTML 中的 MBI_KEY, TicketToken (或從 Cookie 取得)
// 實際需依 Live ID 回傳格式調整正則/解析邏輯
return ExtractTicket(html, resp.Cookies);
}
}
public List GetContacts(string ticketToken)
{
string url = $"https://social.msdn.microsoft.com/.../Contacts?ticket={ticketToken}";
// 或使用 Live Connect REST API: https://apis.live.net/v5.0/me/contacts?access_token={token}
// 需先在 Azure 註冊應用取得 Client ID/Secret,走標準 OAuth 2.0 流程 (更推薦)
// 以下為直接抓取頁面/舊版 API 示意
var req = (HttpWebRequest)WebRequest.Create(url);
req.Headers["Authorization"] = $"Bearer {ticketToken}";
// ... 解析 XML/JSON 回傳 List { Email, Name, ... }
}
上述「代輸入帳密」模式屬 **ClientLogin / Delegated Auth**,微軟已棄用且安全性差。現代做法:
https://login.live.com/oauth20_authorize.srf?client_id={id}&scope=wl.basic,wl.emails&response_type=code&redirect_uri={your_callback}。code。code 換取 access_token (POST https://login.live.com/oauth20_token.srf)。GET https://apis.live.net/v5.0/me/contacts?access_token={token} 取得標準 JSON 聯絡人資料。優點:不接觸使用者密碼、權限可控、Token 可撤銷、符合 GDPR/隱私法規。
contacts.readonly)。/me/friends (需 user_friends 權限,審核嚴格)。建議封裝統一介面 IContactProvider,各提供商實作 GetContacts(accessToken),Controller 僅依賴介面,新增管道零修改業務邏輯。
從模擬登入到標準 OAuth 2.0,聯絡人匯入技術已完成世代交替。採用官方 API + OAuth 不僅安全合規,更能獲得穩定、文件完善、長期維護的整合體驗。本文提供的舊版程式碼僅供理解歷史脈絡,新專案請直接採用現代 OAuth 流程。