public AnalyticsService Handle(string _userId, string _connectionString, string _googleRedirectUri, string _applicationName, string[] _scopes) { try { string UserId = _userId;//The user ID wil be for examlpe the users gmail address. AnalyticsService service; GoogleAuthorizationCodeFlow flow; //use extended class to create google authorization code flow flow = new ForceOfflineGoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer { DataStore = new DbDataStore(_connectionString),//DataStore class to save the token in a SQL database. ClientSecrets = new ClientSecrets { ClientId = "XXX-YOUR CLIENTID-XXX", ClientSecret = "XXX-YOURCLIENTSECRET-XXX" }, Scopes = _scopes, }); var uri = HttpContext.Current.Request.Url.ToString(); string redirecturi = _googleRedirectUri; //This is the redirect URL set in google developer console. var code = HttpContext.Current.Request["code"]; if (code != null) { var token = flow.ExchangeCodeForTokenAsync(UserId, code, uri.Substring(0, uri.IndexOf("?")), CancellationToken.None).Result; var test = HttpContext.Current.Request["state"]; // Extract the right state. var oauthState = AuthWebUtility.ExtracRedirectFromState( flow.DataStore, UserId, HttpContext.Current.Request["state"]).Result; HttpContext.Current.Response.Redirect(oauthState); } else { var result = new AuthorizationCodeWebApp(flow, redirecturi, uri).AuthorizeAsync(UserId, CancellationToken.None).Result; if (result.RedirectUri != null) { // Redirect the user to the authorization server. HttpContext.Current.Response.Redirect(result.RedirectUri); } else { // The data store contains the user credential, so the user has been already authenticated. service = new AnalyticsService(new BaseClientService.Initializer() { HttpClientInitializer = result.Credential, ApplicationName = _applicationName }); return(service); } } return(null); } catch (Exception ex) { throw ex; } }
/// <summary> /// Efetua login OAuth no google e grava dados em banco de dados para não precisar ficar logando a cada acesso /// </summary> /// <param name="usuarioID">ID do usuário que está logando</param> /// <param name="conexaoBanco">String de conexão com banco de dados</param> /// <param name="urlRedirecionamento">URL que o google irá redirecionar de volta após o Login</param> /// <param name="aplicacaoNome">Nome da aplicação no google console developer</param> /// <param name="escopos">Escopos que definem o que será usado do serviço</param> /// <returns>Retorna o serviço que será usado</returns> public static CalendarService OAuthLogin(string usuarioID, string conexaoBanco, string urlRedirecionamento, string aplicacaoNome, string[] escopos) { try { CalendarService service = new CalendarService(); //Use uma classe extendida para autenticação Google Flow GoogleAuthorizationCodeFlow flow; flow = new ForceOfflineGoogleAuthorizationCodeFlow( new GoogleAuthorizationCodeFlow.Initializer { //Classe GoogleDAO para salvar o token de acesso no banco de dados. DataStore = new GoogleDAO(conexaoBanco), ClientSecrets = new ClientSecrets { ClientId = "215187720738-qvd9a4kbm69cqd5iuutgekhspg67l8ar.apps.googleusercontent.com", ClientSecret = "96JWX7tgheXLn1pe5QJw968E" }, Scopes = escopos }); var uri = Convert.ToString(HttpContext.Current.Request.Url); //URL de redirecionamento configurada no painel do google developers console. string uriRedirecionamento = urlRedirecionamento; if (HttpContext.Current.Request["code"] != null) { var token = flow.ExchangeCodeForTokenAsync(usuarioID, HttpContext.Current.Request["code"], uri.Substring(0, uri.IndexOf("?")), CancellationToken.None).Result; // Extrai dados salvos. var oauthState = AuthWebUtility.ExtracRedirectFromState(flow.DataStore, usuarioID, HttpContext.Current.Request["state"]).Result; var dados = new AuthorizationCodeWebApp(flow, uriRedirecionamento, uri).AuthorizeAsync(usuarioID, CancellationToken.None).Result; //Caso já exista no banco de dados o token, o usuário já possui permissão e está logado. service = new CalendarService ( new BaseClientService.Initializer() { HttpClientInitializer = dados.Credential, ApplicationName = aplicacaoNome } ); return(service); } else { var dados = new AuthorizationCodeWebApp(flow, uriRedirecionamento, uri).AuthorizeAsync(usuarioID, CancellationToken.None).Result; if (dados.RedirectUri != null) { //Redireciona o usuário para fazer login e dar as permissões HttpContext.Current.Response.Redirect(dados.RedirectUri); } else { //Caso já exista no banco de dados o token, o usuário já possui permissão e está logado. service = new CalendarService ( new BaseClientService.Initializer() { HttpClientInitializer = dados.Credential, ApplicationName = aplicacaoNome } ); return(service); } } return(null); } catch (Exception ex) { throw ex; } }