summaryrefslogtreecommitdiffstats
path: root/samples/DotNetOpenAuth.ApplicationBlock/OAuth2/Facebook
diff options
context:
space:
mode:
Diffstat (limited to 'samples/DotNetOpenAuth.ApplicationBlock/OAuth2/Facebook')
-rw-r--r--samples/DotNetOpenAuth.ApplicationBlock/OAuth2/Facebook/FacebookClient.cs105
-rw-r--r--samples/DotNetOpenAuth.ApplicationBlock/OAuth2/Facebook/FacebookGraph.cs303
2 files changed, 408 insertions, 0 deletions
diff --git a/samples/DotNetOpenAuth.ApplicationBlock/OAuth2/Facebook/FacebookClient.cs b/samples/DotNetOpenAuth.ApplicationBlock/OAuth2/Facebook/FacebookClient.cs
new file mode 100644
index 0000000..b8717f7
--- /dev/null
+++ b/samples/DotNetOpenAuth.ApplicationBlock/OAuth2/Facebook/FacebookClient.cs
@@ -0,0 +1,105 @@
+//-----------------------------------------------------------------------
+// <copyright file="FacebookClient.cs" company="Outercurve Foundation">
+// Copyright (c) Outercurve Foundation. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOpenAuth.ApplicationBlock {
+ using System;
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Linq;
+ using System.Net;
+ using System.Text;
+ using System.Web;
+ using DotNetOpenAuth.Messaging;
+ using DotNetOpenAuth.OAuth2;
+
+ public class FacebookClient : WebServerClient {
+ private static readonly AuthorizationServerDescription FacebookDescription = new AuthorizationServerDescription {
+ TokenEndpoint = new Uri("https://graph.facebook.com/oauth/access_token"),
+ AuthorizationEndpoint = new Uri("https://graph.facebook.com/oauth/authorize"),
+ ProtocolVersion = ProtocolVersion.V20
+ };
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="FacebookClient"/> class.
+ /// </summary>
+ public FacebookClient()
+ : base(FacebookDescription) {
+ }
+
+ public IOAuth2Graph GetGraph(IAuthorizationState authState, string[] fields = null) {
+ if ((authState != null) && (authState.AccessToken != null)) {
+ string fieldsStr = (fields == null) || (fields.Length == 0) ? FacebookGraph.Fields.Defaults : string.Join(",", fields);
+
+ WebRequest request = WebRequest.Create("https://graph.Facebook.com/me?access_token=" + Uri.EscapeDataString(authState.AccessToken) + "&fields=" + fieldsStr);
+ WebResponse response = request.GetResponse();
+
+ if (response != null) {
+ Stream responseStream = response.GetResponseStream();
+
+ if (responseStream != null) {
+ return FacebookGraph.Deserialize(responseStream);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /// <summary>
+ /// Well-known permissions defined by Facebook.
+ /// </summary>
+ /// <remarks>
+ /// This sample includes just a few permissions. For a complete list of permissions please refer to:
+ /// https://developers.facebook.com/docs/reference/login/
+ /// </remarks>
+ public static class Scopes {
+ #region Email Permissions
+ /// <summary>
+ /// Provides access to the user's primary email address in the email property. Do not spam users. Your use of email must comply both with Facebook policies and with the CAN-SPAM Act.
+ /// </summary>
+ public const string Email = "email";
+ #endregion
+
+ #region Extended Permissions
+ /// <summary>
+ /// Provides access to any friend lists the user created. All user's friends are provided as part of basic data, this extended permission grants access to the lists of friends a user has created, and should only be requested if your application utilizes lists of friends.
+ /// </summary>
+ public const string ReadFriendlists = "read_friendlists";
+
+ /// <summary>
+ /// Provides read access to the Insights data for pages, applications, and domains the user owns.
+ /// </summary>
+ public const string ReadInsights = "read_insights";
+ #endregion
+
+ #region Extended Profile Properties
+ /// <summary>
+ /// Provides access to the "About Me" section of the profile in the about property
+ /// </summary>
+ public const string UserAboutMe = "user_about_me";
+
+ /// <summary>
+ /// Provides access to the user's list of activities as the activities connection
+ /// </summary>
+ public const string UserActivities = "user_activities";
+
+ /// <summary>
+ /// Provides access to the birthday with year as the birthday property. Note that your app may determine if a user is "old enough" to use an app by obtaining the age_range public profile property
+ /// </summary>
+ public const string UserBirthday = "user_birthday";
+ #endregion
+
+ #region Open Graph Permissions
+ #endregion
+
+ #region Page Permissions
+ #endregion
+
+ #region Public Profile and Friend List
+ #endregion
+ }
+ }
+}
diff --git a/samples/DotNetOpenAuth.ApplicationBlock/OAuth2/Facebook/FacebookGraph.cs b/samples/DotNetOpenAuth.ApplicationBlock/OAuth2/Facebook/FacebookGraph.cs
new file mode 100644
index 0000000..a62b410
--- /dev/null
+++ b/samples/DotNetOpenAuth.ApplicationBlock/OAuth2/Facebook/FacebookGraph.cs
@@ -0,0 +1,303 @@
+//-----------------------------------------------------------------------
+// <copyright file="FacebookGraph.cs" company="Outercurve Foundation">
+// Copyright (c) Outercurve Foundation. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOpenAuth.ApplicationBlock {
+ using System;
+ using System.Collections.Generic;
+ using System.Globalization;
+ using System.IO;
+ using System.Linq;
+ using System.Runtime.Serialization;
+ using System.Runtime.Serialization.Json;
+ using System.Text;
+
+ //// Documentation: https://developers.facebook.com/docs/reference/api/user/
+
+ [DataContract]
+ public class FacebookGraph : IOAuth2Graph {
+ private static DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(FacebookGraph));
+
+ /// <summary>
+ /// Gets or sets the user's Facebook ID
+ /// </summary>
+ [DataMember(Name = "id")]
+ public string Id { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's full name
+ /// </summary>
+ [DataMember(Name = "name")]
+ public string Name { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's first name
+ /// </summary>
+ [DataMember(Name = "first_name")]
+ public string FirstName { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's middle name
+ /// </summary>
+ [DataMember(Name = "middle_name")]
+ public string MiddleName { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's last name
+ /// </summary>
+ [DataMember(Name = "last_name")]
+ public string LastName { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's gender: female or male
+ /// </summary>
+ [DataMember(Name = "gender")]
+ public string Gender { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's locale
+ /// </summary>
+ [DataMember(Name = "locale")]
+ public string Locale { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's languages
+ /// </summary>
+ [DataMember(Name = "languages")]
+ public FacebookIdName[] Languages { get; set; }
+
+ /// <summary>
+ /// Gets or sets the URL of the profile for the user on Facebook
+ /// </summary>
+ [DataMember(Name = "link")]
+ public Uri Link { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's Facebook username
+ /// </summary>
+ [DataMember(Name = "username")]
+ public string Username { get; set; }
+
+ // age_range
+
+ // third_party_id
+
+ // installed
+
+ /// <summary>
+ /// Gets or sets the user's timezone offset from UTC
+ /// </summary>
+ [DataMember(Name = "timezone")]
+ public int? Timezone { get; set; }
+
+ /// <summary>
+ /// Gets or sets the last time the user's profile was updated; changes to the languages, link, timezone, verified, interested_in, favorite_athletes, favorite_teams, and video_upload_limits are not not reflected in this value
+ /// string containing an ISO-8601 datetime
+ /// </summary>
+ [DataMember(Name = "updated_time")]
+ public string UpdatedTime { get; set; }
+
+ // verified
+
+ // bio
+
+ /// <summary>
+ /// Gets or sets the user's birthday
+ /// Date string in MM/DD/YYYY format
+ /// </summary>
+ [DataMember(Name = "birthday")]
+ public string Birthday { get; set; }
+
+ [Obsolete]
+ [DataMember(Name = "birthday_date")]
+ public string BirthdayDate { get; set; }
+
+ // cover
+
+ // currency
+
+ // devices
+
+ // education
+
+ /// <summary>
+ /// Gets or sets the proxied or contact email address granted by the user
+ /// </summary>
+ [DataMember(Name = "email")]
+ public string Email { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's hometown
+ /// </summary>
+ [DataMember(Name = "hometown")]
+ public FacebookIdName Hometown { get; set; }
+
+ /// <summary>
+ /// Gets or sets the genders the user is interested in
+ /// </summary>
+ [DataMember(Name = "interested_in")]
+ public string[] InterestedIn { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's current city
+ /// </summary>
+ [DataMember(Name = "location")]
+ public FacebookIdName Location { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's political view
+ /// </summary>
+ [DataMember(Name = "political")]
+ public string Political { get; set; }
+
+ // payment_pricepoints
+
+ /// <summary>
+ /// Gets or sets the user's favorite athletes; this field is deprecated and will be removed in the near future
+ /// </summary>
+ [Obsolete]
+ [DataMember(Name = "favorite_athletes")]
+ public FacebookIdName[] FavoriteAthletes { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's favorite teams; this field is deprecated and will be removed in the near future
+ /// </summary>
+ [Obsolete]
+ [DataMember(Name = "favorite_teams")]
+ public FacebookIdName[] FavoriteTeams { get; set; }
+
+ /// <summary>
+ /// Gets or sets the URL of the user's profile pic (only returned if you explicitly specify a 'fields=picture' param)
+ /// If the "October 2012 Breaking Changes" migration setting is enabled for your app, this field will be an object with the url and is_silhouette fields; is_silhouette is true if the user has not uploaded a profile picture
+ /// </summary>
+ [DataMember(Name = "picture")]
+ public FacebookPicture Picture { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's favorite quotes
+ /// </summary>
+ [DataMember(Name = "quotes")]
+ public Uri Quotes { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's relationship status: Single, In a relationship, Engaged, Married, It's complicated, In an open relationship, Widowed, Separated, Divorced, In a civil union, In a domestic partnership
+ /// </summary>
+ [DataMember(Name = "relationship_status")]
+ public string RelationshipStatus { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's religion
+ /// </summary>
+ [DataMember(Name = "religion")]
+ public string Religion { get; set; }
+
+ // security_settings
+
+ /// <summary>
+ /// Gets or sets the user's significant other
+ /// </summary>
+ [DataMember(Name = "significant_other")]
+ public FacebookIdName SignificantOther { get; set; }
+
+ // video_upload_limits
+
+ /// <summary>
+ /// Gets or sets the URL of the user's personal website
+ /// </summary>
+ [DataMember(Name = "website")]
+ public Uri Website { get; set; }
+
+ public DateTime? BirthdayDT {
+ get {
+ if (!string.IsNullOrEmpty(this.Birthday) && (this.Locale != null)) {
+ CultureInfo ci = new CultureInfo(this.Locale.Replace('_', '-'));
+ return DateTime.Parse(this.Birthday, ci);
+ }
+
+ return null;
+ }
+ }
+
+ public Uri AvatarUrl {
+ get {
+ if ((this.Picture != null) && (this.Picture.Data != null) && (this.Picture.Data.Url != null)) {
+ return this.Picture.Data.Url;
+ }
+
+ return null;
+ }
+ }
+
+ public HumanGender GenderEnum {
+ get {
+ if (this.Gender == "male") {
+ return HumanGender.Male;
+ } else if (this.Gender == "female") {
+ return HumanGender.Female;
+ }
+
+ return HumanGender.Unknown;
+ }
+ }
+
+ public static FacebookGraph Deserialize(string json) {
+ if (string.IsNullOrEmpty(json)) {
+ throw new ArgumentNullException("json");
+ }
+
+ return Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(json)));
+ }
+
+ public static FacebookGraph Deserialize(Stream jsonStream) {
+ if (jsonStream == null) {
+ throw new ArgumentNullException("jsonStream");
+ }
+
+ return (FacebookGraph)jsonSerializer.ReadObject(jsonStream);
+ }
+
+ public static class Fields {
+ public const string Defaults = "id,name,first_name,middle_name,last_name,gender,locale,link,username";
+
+ public const string Birthday = "locale,birthday";
+
+ public const string Email = "email";
+
+ public const string Picture = "picture";
+ }
+
+ /// <summary>
+ /// Obsolete: used only before October 2012
+ /// </summary>
+ [Obsolete]
+ [DataContract]
+ public class FacebookPicture {
+ [DataMember(Name = "data")]
+ public FacebookPictureData Data { get; set; }
+ }
+
+ /// <summary>
+ /// Obsolete: used only before October 2012
+ /// </summary>
+ [Obsolete]
+ [DataContract]
+ public class FacebookPictureData {
+ [DataMember(Name = "url")]
+ public Uri Url { get; set; }
+
+ [DataMember(Name = "is_silhouette")]
+ public bool IsSilhouette { get; set; }
+ }
+
+ [DataContract]
+ public class FacebookIdName {
+ [DataMember(Name = "id")]
+ public string Id { get; set; }
+
+ [DataMember(Name = "name")]
+ public string Name { get; set; }
+ }
+ }
+}