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;
            }
        }
Пример #2
0
        /// <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;
            }
        }