protected void Page_Load(object sender, EventArgs e) { Title = "Google OAuth"; Callback = Request.QueryString["callback"]; ContentTypeAlias = Request.QueryString["contentTypeAlias"]; PropertyAlias = Request.QueryString["propertyAlias"]; Feature = Request.QueryString["feature"]; if (AuthState != null) { NameValueCollection stateValue = Session["Skybrud.Social_" + AuthState] as NameValueCollection; if (stateValue != null) { Callback = stateValue["Callback"]; ContentTypeAlias = stateValue["ContentTypeAlias"]; PropertyAlias = stateValue["PropertyAlias"]; Feature = stateValue["Feature"]; } } // Get the prevalue options GoogleOAuthPreValueOptions options = GoogleOAuthPreValueOptions.Get(ContentTypeAlias, PropertyAlias); if (!options.IsValid) { Content.Text += "Hold on now! The options of the underlying prevalue editor isn't valid."; return; } // Configure the OAuth client based on the options of the prevalue options GoogleOAuthClient client = new GoogleOAuthClient { ClientId = options.ClientId, ClientSecret = options.ClientSecret, RedirectUri = options.RedirectUri }; // Session expired? if (AuthState != null && Session["Skybrud.Social_" + AuthState] == null) { Content.Text = "<div class=\"error\">Session expired?</div>"; return; } // Check whether an error response was received from Google if (AuthError != null) { Content.Text = "<div class=\"error\">Error: " + AuthErrorDescription + "</div>"; if (AuthState != null) { Session.Remove("Skybrud.Social:" + AuthState); } return; } string state; // Redirect the user to the Google login dialog if (AuthCode == null) { // Generate a new unique/random state state = Guid.NewGuid().ToString(); // Save the state in the current user session Session["Skybrud.Social_" + state] = new NameValueCollection { { "Callback", Callback }, { "ContentTypeAlias", ContentTypeAlias }, { "PropertyAlias", PropertyAlias }, { "Feature", Feature } }; // Declare the scope GoogleScopeCollection defaultScope = new[] { GoogleScope.OpenId, GoogleScope.Email, GoogleScope.Profile }; string scope = options.Scope != null?string.Join(" ", options.Scope) : defaultScope.ToString(); // Construct the authorization URL string url = client.GetAuthorizationUrl(state, scope, GoogleAccessType.Offline, GoogleApprovalPrompt.Force); // Redirect the user Response.Redirect(url); return; } GoogleAccessTokenResponse info; try { info = client.GetAccessTokenFromAuthorizationCode(AuthCode); } catch (Exception ex) { Content.Text = "<div class=\"error\"><b>Unable to acquire access token</b><br />" + ex.Message + "</div>"; return; } try { // Initialize the Google service GoogleService service = GoogleService.CreateFromRefreshToken(client.ClientIdFull, client.ClientSecret, info.RefreshToken); // Get information about the authenticated user GoogleUserInfo user = service.GetUserInfo(); Content.Text += "<p>Hi <strong>" + user.Name + "</strong></p>"; Content.Text += "<p>Please wait while you're being redirected...</p>"; // Set the callback data GoogleOAuthData data = new GoogleOAuthData { Id = user.Id, Name = user.Name, Avatar = user.Picture, ClientId = client.ClientIdFull, ClientSecret = client.ClientSecret, RefreshToken = info.RefreshToken }; // Update the UI and close the popup window Page.ClientScript.RegisterClientScriptBlock(GetType(), "callback", String.Format( "self.opener." + Callback + "({0}); window.close();", data.Serialize() ), true); } catch (Exception ex) { Content.Text = "<div class=\"error\"><b>Unable to get user information</b><br />" + ex.Message + "</div>"; return; } }
public ActionResult GoogleLogin() { var resultMessage = new GenericMessageViewModel(); Callback = Request.QueryString["callback"]; ContentTypeAlias = Request.QueryString["contentTypeAlias"]; PropertyAlias = Request.QueryString["propertyAlias"]; Feature = Request.QueryString["feature"]; if (AuthState != null) { var stateValue = Session["MVCForum_" + AuthState] as NameValueCollection; if (stateValue != null) { Callback = stateValue["Callback"]; ContentTypeAlias = stateValue["ContentTypeAlias"]; PropertyAlias = stateValue["PropertyAlias"]; Feature = stateValue["Feature"]; } } if (string.IsNullOrEmpty(SiteConstants.Instance.GooglePlusAppId) || string.IsNullOrEmpty(SiteConstants.Instance.GooglePlusAppSecret)) { resultMessage.Message = "You need to add the Google app credentials"; resultMessage.MessageType = GenericMessages.danger; } else { // Configure the OAuth client based on the options of the prevalue options var client = new GoogleOAuthClient { ClientId = SiteConstants.Instance.GooglePlusAppId, ClientSecret = SiteConstants.Instance.GooglePlusAppSecret, RedirectUri = ReturnUrl }; // Session expired? if (AuthState != null && Session["MVCForum_" + AuthState] == null) { resultMessage.Message = "Session Expired"; resultMessage.MessageType = GenericMessages.danger; } // Check whether an error response was received from Google if (AuthError != null) { resultMessage.Message = AuthErrorDescription; resultMessage.MessageType = GenericMessages.danger; if (AuthState != null) { Session.Remove("MVCForum_" + AuthState); } } // Redirect the user to the Google login dialog if (AuthCode == null) { // Generate a new unique/random state var state = Guid.NewGuid().ToString(); // Save the state in the current user session Session["MVCForum_" + state] = new NameValueCollection { { "Callback", Callback }, { "ContentTypeAlias", ContentTypeAlias }, { "PropertyAlias", PropertyAlias }, { "Feature", Feature } }; // Declare the scope var scope = new[] { GoogleScopes.OpenId, GoogleScopes.Email, GoogleScopes.Profile }; // Construct the authorization URL var url = client.GetAuthorizationUrl(state, scope, GoogleAccessType.Offline, GoogleApprovalPrompt.Force); // Redirect the user return(Redirect(url)); } var info = new GoogleAccessTokenResponse(); try { info = client.GetAccessTokenFromAuthorizationCode(AuthCode); } catch (Exception ex) { resultMessage.Message = string.Format("Unable to acquire access token<br/>{0}", ex.Message); resultMessage.MessageType = GenericMessages.danger; } try { // Initialize the Google service var service = GoogleService.CreateFromRefreshToken(client.ClientIdFull, client.ClientSecret, info.RefreshToken); // Get information about the authenticated user var user = service.GetUserInfo(); using (UnitOfWorkManager.NewUnitOfWork()) { var userExists = MembershipService.GetUserByEmail(user.Email); if (userExists != null) { // Users already exists, so log them in FormsAuthentication.SetAuthCookie(userExists.UserName, true); resultMessage.Message = LocalizationService.GetResourceString("Members.NowLoggedIn"); resultMessage.MessageType = GenericMessages.success; ShowMessage(resultMessage); return(RedirectToAction("Index", "Home")); } else { // Not registered already so register them var viewModel = new MemberAddViewModel { Email = user.Email, LoginType = LoginType.Google, Password = StringUtils.RandomString(8), UserName = user.Name, SocialProfileImageUrl = user.Picture, UserAccessToken = info.RefreshToken }; // Store the viewModel in TempData - Which we'll use in the register logic TempData[AppConstants.MemberRegisterViewModel] = viewModel; return(RedirectToAction("SocialLoginValidator", "Members")); } } } catch (Exception ex) { resultMessage.Message = string.Format("Unable to get user information<br/>{0}", ex.Message); resultMessage.MessageType = GenericMessages.danger; LoggingService.Error(ex); } } ShowMessage(resultMessage); return(RedirectToAction("LogOn", "Members")); }
protected void Page_Load(object sender, EventArgs e) { //Get current user var currentUser = UmbracoContext.Current.Security.CurrentUser; //Check a user is logged into backoffice if (currentUser == null) { //Ouput an error message Content.Text += ui.Text("analytics", "noAccess"); return; } //Check the user has access to the analytics section //Prevents anyone with this URL to page from just hitting it if (!currentUser.AllowedSections.Contains("analytics")) { //Ouput an error message Content.Text += ui.Text("analytics", "noAccess"); return; } // Get the state from the query string string state = Request.QueryString["state"]; // Check whether the state is present if (String.IsNullOrWhiteSpace(state)) { //Ouput an error message Content.Text += ui.Text("analytics", "noStateSpecified"); return; } // Get the session value string session = Session["Analytics_" + state] as string; // Has the session expire? if (session == null) { //Ouput an error message Content.Text += ui.Text("analytics", "sorrySessionExpired"); return; } // Get the refresh token from the query string (kinda bad practice though) string refreshToken = Request.QueryString["token"]; // Do we have a refresh token? if (String.IsNullOrWhiteSpace(refreshToken)) { //Ouput an error message Content.Text += ui.Text("analytics", "somethingWentWrong"); return; } // Initalize a new instance of the GoogleService class GoogleService service = GoogleService.CreateFromRefreshToken(AnalyticsConfig.ClientId, AnalyticsConfig.ClientSecret, refreshToken); try { //Get the authenticated user GoogleUserInfo user = service.GetUserInfo(); //Set the refresh token in our config AnalyticsConfig.RefreshToken = refreshToken; //Ouput some info about the user //Using UmbracoUser (obsolete) - somehow it fails to compile when using Security.CurrentUser //ui.text requires OLD BusinessLogic User object type not shiny new one //Can we use another helper/library to get the translation text? var umbUser = new User(currentUser.Id); Content.Text = ui.Text("analytics", "informationSavedMessage", user.Name, umbUser); } catch { //Ouput an error message Content.Text += ui.Text("analytics", "somethingWentWrong"); } // Clear the session state Session.Remove("Analytics_" + state); }
/// <summary> /// Initializes a new instance of the GoogleService class. Invoking this method will make a /// call to the Google API since we need to obtain an access token from the stored OAuth /// data. /// </summary> public GoogleService GetService() { return(_service ?? (_service = GoogleService.CreateFromRefreshToken(ClientId, ClientSecret, RefreshToken))); }
private GoogleService GetGoogleService() { return GoogleService.CreateFromRefreshToken(AnalyticsConfig.ClientId, AnalyticsConfig.ClientSecret, AnalyticsConfig.RefreshToken); }
public object GetData(int pageId, string period = "yesterday") { IPublishedContent content = Umbraco.Content(pageId); if (content == null) { return(Request.CreateResponse(JsonMetaResponse.GetError("Page not found or not published."))); } IPublishedContent site = GetSiteNode(content); if (site == null) { return(Request.CreateResponse(JsonMetaResponse.GetError("Unable to determine site node."))); } AnalyticsProfileSelection selection = site.Value("analyticsProfile") as AnalyticsProfileSelection; // Get a reference to the configuration of this package AnalyticsConfig config = AnalyticsConfig.Current; string profileId = null; GoogleService service = null; if (selection != null && selection.IsValid) { profileId = selection.Profile.Id; AnalyticsConfigUser user = config.GetUserById(selection.User.Id); if (user != null) { service = GoogleService.CreateFromRefreshToken( user.Client.ClientId, user.Client.ClientSecret, user.RefreshToken ); } } // Fallback to app settings (if specified) if (service == null && config.HasAppSettings) { profileId = config.AppSettings.AnalyticsProfileId; service = GoogleService.CreateFromRefreshToken( config.AppSettings.GoogleClientId, config.AppSettings.GoogleClientSecret, config.AppSettings.GoogleRefreshToken ); } if (String.IsNullOrWhiteSpace(profileId) || service == null) { return(Request.CreateResponse(JsonMetaResponse.GetError("The Analytics package is not configured."))); } AnalyticsDataMode mode = content.Id == site.Id ? AnalyticsDataMode.Site : AnalyticsDataMode.Page; Period p = Period.Parse(period); return(new { period = p, page = new { id = content.Id, name = content.Name, url = content.Url }, history = GetHistory(service.Analytics, profileId, content, mode, p) }); }