驗證工作流程有兩個主要問題需要解決。其一,正如OP正確指出的那樣,涉及ExtraData
的內容,另一個涉及您需要向Facebook提供的權限。最後,我去了DotNetOpenAuth
圖書館,而不是微軟的圖書館,但在某些地方擴展了它,通過滾動我自己的課程並在必要時借用框架的一部分。
我做的第一件事是創建一個FacebookClient
即延長從DotNetOpenAuth
的OAuth2Client
,讓我在一個值傳遞爲scope
,這得到了過去的數據,你可以從Facebook要求的限制。我要求的許可是publish_stream, manage_pages, email, user_interests
。他們只是附加到服務登錄URL並傳遞到Facebook。我執行OAuth2Client
內的有用的方法是GetUserData
:
protected override IDictionary<string, string> GetUserData(string accessToken)
{
var token = accessToken.EscapeUriDataStringRfc3986();
FacebookGraphData graphData;
var request = WebRequest.Create(string.Format("https://graph.facebook.com/me?access_token={0}", token));
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
graphData = JsonHelper.Deserialize<FacebookGraphData>(responseStream);
}
}
var userData = new Dictionary<string, string> {{"accessToken", accessToken}};
userData.AddItemIfNotEmpty("id", graphData.Id);
userData.AddItemIfNotEmpty("name", graphData.Name);
userData.AddItemIfNotEmpty("email", graphData.Email);
userData.AddItemIfNotEmpty("firstName", graphData.FirstName);
userData.AddItemIfNotEmpty("lastName", graphData.LastName);
userData.AddItemIfNotEmpty("link", graphData.Link == null ? null : graphData.Link.AbsoluteUri);
userData.AddItemIfNotEmpty("username", graphData.Username);
userData.AddItemIfNotEmpty("gender", graphData.Gender);
userData.AddItemIfNotEmpty("locale", graphData.Locale);
FacebookFriendData friendData;
request = WebRequest.Create(string.Format("https://graph.facebook.com/me/friends?access_token={0}", token));
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
friendData = JsonHelper.Deserialize<FacebookFriendData>(responseStream);
}
}
if (friendData.Friends != null)
{
userData.Add("connections", friendData.Friends.Count().ToString());
}
return userData;
}
我基本上創造了當時響應來自Facebook的背面被反序列化的幾個數據類。我也可以從這裏進行任何其他Graph API調用。序列化類看起來是這樣的:每@ radm4
[DataContract]
public class FacebookFriendData
{
[DataMember(Name = "data")]
public IEnumerable<Friend> Friends { get; set; }
}
[DataContract]
public class Friend
{
[DataMember(Name = "id")]
public string Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
}
[DataContract]
public class FacebookGraphData
{
[DataMember(Name = "id")]
public string Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "email")]
public string Email { get; set; }
[DataMember(Name = "first_name")]
public string FirstName { get; set; }
[DataMember(Name = "last_name")]
public string LastName { get; set; }
[DataMember(Name = "link")]
public Uri Link { get; set; }
[DataMember(Name = "username")]
public string Username { get; set; }
[DataMember(Name = "gender")]
public string Gender { get; set; }
[DataMember(Name = "locale")]
public string Locale { get; set; }
}
當我還是檢查提供的字符串來決定在某些地方要調用哪些方法 - 一個更優雅的解決方案是一個仍在工作......
+1好問題,但我有預感,這主要取決於應用程序如何設置在每個提供程序。例如,如果您告訴Facebook您的應用程序應該請求訪問聯繫人,圖片,電子郵件等,那麼當用戶重定向到Facebook的登錄頁面時,他應該特別授予您對所有這些信息的訪問權限。一旦你的網站被回電,很可能你所有的信息都可以訪問到......這只是我的猜測,我有興趣看到一些答案。 – Icarus
我認爲你需要註冊你的網站與某些外部供應商,如Facebook之前,你可以訪問到用戶的Facebook配置文件數據。 – Derek
您需要向大多數(如果不是全部的話)提供者進行註冊,甚至可以記錄使用OpenAuth庫的人員。 – radm4