Je vyžadována podpora jazyka JavaScript
Některé stránky na tomto webu vyžadují podporu jazyka JavaScript. Váš webový prohlížeč jazyk JavaScript nepodporuje nebo jazyk JavaScript není povolen.
Chcete-li zjistit, zda webový prohlížeč podporuje jazyk JavaScript nebo jazyk JavaScript chcete povolit, přečtěte si nápovědu k vašemu webovému prohlížeči.
FacebookAuthClient.cs
Download fileToto je zdrojový kód souboru FacebookAuthClient.cs
Facebook OAuth 2.0 protocol authentication (server flow authentication).
using System; using System.Collections.Generic; using System.Diagnostics; using System.Web; using Facebook; namespace FacebookAuth { [DebuggerDisplay("UserID = {UserID}, UserName = {UserName}, FullName = {FullName}, Gender = {Gender}, Locale = {Locale}, Email = {Email}")] public sealed class FacebookAuthUser { #region member types declaration private static class AuthUserConstants { #region constants public const string ID = "id"; public const string FullName = "name"; public const string UserName = "username"; public const string FirstName = "first_name"; public const string LastName = "last_name"; public const string Picture = "picture"; public const string Link = "link"; public const string Gender = "gender"; public const string Locale = "locale"; public const string Email = "email"; #endregion } #endregion #region member varible and default property initialization public string UserID { get; private set; } public string UserName { get; private set; } public string FullName { get; private set; } public string FirstName { get; private set; } public string LastName { get; private set; } public string PictureUrl { get; private set; } public string Link { get; private set; } public string Gender { get; private set; } public string Locale { get; private set; } public string Email { get; private set; } #endregion #region constructors and destructors internal FacebookAuthUser(IDictionary<string, object> data) { if (data == null) { throw new ArgumentNullException("data"); } this.UserID = (string)data[AuthUserConstants.ID]; this.UserName = (string)data[AuthUserConstants.UserName]; this.FullName = (string)data[AuthUserConstants.FullName]; this.FirstName = (string)data[AuthUserConstants.FirstName]; this.LastName = (string)data[AuthUserConstants.LastName]; this.PictureUrl = (string)data[AuthUserConstants.Picture]; this.Link = (string)data[AuthUserConstants.Link]; this.Gender = (string)data[AuthUserConstants.Gender]; this.Locale = (string)data[AuthUserConstants.Locale]; if (data.ContainsKey(AuthUserConstants.Email)) { this.Email = (string)data[AuthUserConstants.Email]; } } #endregion #region property getters/setters internal static string[] Fields { get { return new[] { AuthUserConstants.ID, AuthUserConstants.UserName, AuthUserConstants.FullName, AuthUserConstants.FirstName, AuthUserConstants.LastName, AuthUserConstants.Picture, AuthUserConstants.Link, AuthUserConstants.Gender, AuthUserConstants.Locale, AuthUserConstants.Email }; } } #endregion } public class FacebookAuthClient { #region member types declaration private enum DisplayType { Page, Popup, Touch, } private static class AuthCookieConstants { #region constants public const string AccessToken = "access_token"; public const string ExpiresIn = "expires_in"; #endregion } #endregion #region constants private const string fbCookie = "fb_auth"; private const string RequestAccessTokenUrl = "https://graph.facebook.com/oauth/access_token"; /// <summary> /// List of additional display modes can be found at http://developers.facebook.com/docs/reference/dialogs/#display /// </summary> private const DisplayType Display = DisplayType.Page; /// <summary> /// List of default required application permissions like: email, user_about_me, user_birthday, status_update, publish_stream /// You can read more about this at available Facebook permissions at http://developers.facebook.com/docs/authentication/permissions /// </summary> private static readonly string[] DefaultScopes = new[] { "email" }; #endregion #region member varible and default property initialization private readonly string AppId; private readonly string AppSecret; private readonly string RedirectUri; private IEnumerable<string> RequiredScopes; private bool IsInitialized; public string AccessToken { get; private set; } public DateTimeOffset Expires { get; private set; } #endregion #region constructors and destructors public FacebookAuthClient(string appId, string appSecret, string redirectUri, IEnumerable<string> requiredScopes) { if (appId == null) { throw new ArgumentNullException("appId"); } if (appId.Length == 0) { throw new ArgumentException("appId is empty.", "appId"); } if (appSecret == null) { throw new ArgumentNullException("appSecret"); } if (appSecret.Length == 0) { throw new ArgumentException("appSecret is empty.", "appSecret"); } if (redirectUri == null) { throw new ArgumentNullException("redirectUri"); } if (redirectUri.Length == 0) { throw new ArgumentException("redirectUri is empty.", "redirectUri"); } this.AppId = appId; this.AppSecret = appSecret; this.RedirectUri = redirectUri; this.RequiredScopes = requiredScopes ?? DefaultScopes; InitializeInternal(); } public FacebookAuthClient(string appID, string appSecret, string redirectUri) : this(appID, appSecret, redirectUri, null) { } #endregion #region action methods public FacebookAuthUser GetUserInfo() { if (this.AccessToken != null) { return RequestUserInfo(this.AccessToken); } return null; } public static void SignOut(string redirectUrl, bool signOutFromFacebook) { HttpContext context = HttpContext.Current; HttpCookie cookie = context.Request.Cookies[fbCookie]; if (cookie == null) { return; } string accessToken = cookie[AuthCookieConstants.AccessToken]; if (string.IsNullOrEmpty(accessToken)) { return; } HttpContext.Current.Response.Cookies.Remove(fbCookie); HttpContext.Current.Response.Cookies.Add(new HttpCookie(fbCookie)); if (signOutFromFacebook) { var fb = new FacebookClient(); var parameters = new Dictionary<string, object>(); parameters["access_token"] = accessToken; parameters["next"] = redirectUrl; var logouUrl = fb.GetLogoutUrl(parameters); HttpContext.Current.Response.Redirect(logouUrl.AbsoluteUri); } else { HttpContext.Current.Response.Redirect(redirectUrl); } } public static void ProcessCallback(string appId, string appSecret, string redirectUri) { var client = new FacebookAuthClient(appId, appSecret, redirectUri); client.OnAuthenticateCompleted(HttpContext.Current.Request.Url); } #endregion #region property getters/setters public string LoginUrl { get { return BuildLoginUrl(this.AppId, this.RedirectUri, this.RequiredScopes, null); } } #endregion #region private member functions private void InitializeInternal() { if (this.IsInitialized) { return; } this.IsInitialized = true; HttpContext context = HttpContext.Current; HttpCookie cookie = context.Request.Cookies[fbCookie]; if (cookie != null) { string accessToken = cookie[AuthCookieConstants.AccessToken]; if (!string.IsNullOrEmpty(accessToken)) { DateTimeOffset expires = DateTimeOffset.FromFileTime(Int64.Parse(cookie[AuthCookieConstants.ExpiresIn])); //Check Expiration if (expires > DateTimeOffset.UtcNow.Add(new TimeSpan(0, 0, 60))) { this.AccessToken = accessToken; this.Expires = expires; } } } } private bool OnAuthenticateCompleted(Uri responseUri) { var fb = new FacebookClient(); FacebookOAuthResult oauthResult; if (fb.TryParseOAuthCallbackUrl(responseUri, out oauthResult)) { if (oauthResult.IsSuccess) { //Exchange the code for a user access token var results = GetAccessTokenForCode(oauthResult.Code, this.AppId, this.AppSecret, this.RedirectUri); this.AccessToken = results.AccessToken; this.Expires = results.Expires; SetFacebookAuthCookie(); return true; } } return false; } private void SetFacebookAuthCookie() { var cookie = new HttpCookie(fbCookie); if (this.AccessToken != null) { cookie[AuthCookieConstants.AccessToken] = HttpUtility.UrlEncode(this.AccessToken); cookie[AuthCookieConstants.ExpiresIn] = this.Expires.ToFileTime().ToString(); } HttpContext.Current.Response.Cookies.Remove(fbCookie); HttpContext.Current.Response.Cookies.Add(cookie); } private static FacebookOAuthResult GetAccessTokenForCode(string code, string appId, string appSecret, string redirectUri) { var fb = new FacebookClient(); var parameters = new Dictionary<string, object>(); parameters["client_id"] = appId; parameters["client_secret"] = appSecret; parameters["code"] = code; parameters["redirect_uri"] = redirectUri; var data = (IDictionary<string, object>)fb.Post(RequestAccessTokenUrl, parameters); //Parse results to FacebookOAuthResult object string responseData = string.Format("access_token={0}&expires_in={1}", data["access_token"], data["expires"]); FacebookOAuthResult oauthResult = fb.ParseOAuthCallbackUrl(new Uri(redirectUri + "#" + responseData, UriKind.Absolute)); return oauthResult; } private static FacebookAuthUser RequestUserInfo(string accessToken) { var fb = new FacebookClient(accessToken); var result = (IDictionary<string, object>)fb.Get("me", new { fields = string.Join(",", FacebookAuthUser.Fields) }); return new FacebookAuthUser(result); } private static string BuildLoginUrl(string appId, string redirectUri, IEnumerable<string> scopes, object state) { var parameters = new Dictionary<string, object>(); parameters["client_id"] = appId; parameters["response_type"] = "code"; //Must be code, because token is not returned in query string parameters["display"] = Display.ToString().ToLowerInvariant(); parameters["redirect_uri"] = redirectUri; if (state != null) { parameters["state"] = state; } //Add the scope parameter only if we have some scopes. if (scopes != null) { string scope = string.Join(",", scopes); if (!string.IsNullOrEmpty(scope)) { parameters["scope"] = scope; } } var fb = new FacebookClient(); return fb.GetLoginUrl(parameters).AbsoluteUri; } #endregion } }