// GET: OAuth/FacebooTeamAuth public async Task <ActionResult> FacebookTeamAuth(string code, string state) { GetUser(out _, out ApplicationUser user); string access_token = await FacebookAuthenticator.ExchangeOAuthCodeAsync(code, Url.Action("FacebookTeamAuth", "OAuth", null, this.Request.Url.Scheme)); if (user.Team.LeaderId == user.Id) { List <FacebookAccountViewModel> accounts = await FacebookAuthenticator.GetPageAuthTokens(access_token); if (user.FbTeamAccount == null) { user.FbTeamAccount = new FacebookTeamAccount(); } user.FbTeamAccount.helper_access_token = access_token; _context.SaveChanges(); return(View("~/Views/Dashboard/FacebookAccounts.cshtml", new DashboardViewModel <Tuple <string, List <FacebookAccountViewModel> >, ApplicationUser>(Tuple.Create("Team", accounts), user))); } string account_id = user.Team.Leader.FbTeamAccount.AccountId; if (account_id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "It looks like your leader did not connect any account of this type.")); } FacebookAccountViewModel account = (await FacebookAuthenticator.GetPageAuthTokens(access_token, account_id)) .SingleOrDefault(); if (account == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Something went wrong, make sure that you have privileges to team's social media account.")); } if (user.FbTeamAccount == null) { user.FbTeamAccount = new FacebookTeamAccount(); } user.FbTeamAccount.AccountId = account.Id; user.FbTeamAccount.AccountName = account.Name; user.FbTeamAccount.account_access_token = account.access_token; _context.SaveChanges(); return(RedirectToAction("Team", "Dashboard")); }
public async Task <FacebookAccountViewModel> GetUserAccount(string access_token) // Exchange code for access_token { var fields = new Dictionary <string, string> { { "fields", "id,name,picture{url}" }, { "access_token", access_token } }; string response = await _client.GetAsync("/me", Utils.GetQueryString(fields)); FacebookAccountViewModel account = GetAccount(JObject.Parse(response)); account.access_token = access_token; return(account); }
// POST OAuth/SaveTeamAccount public async Task <ActionResult> SaveTeamAccount() { GetUser(out _, out ApplicationUser user); FacebookAccountViewModel account = (await FacebookAuthenticator.GetPageAuthTokens(user.FbTeamAccount.helper_access_token, Request.Form["id"])) .SingleOrDefault(); if (account == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Something went terribly wrong!! If this error persists report it to the FlowHub team.")); } user.FbTeamAccount.AccountId = account.Id; user.FbTeamAccount.AccountName = account.Name; user.FbTeamAccount.account_access_token = account.access_token; _context.SaveChanges(); return(JavaScript("window.location = '" + Url.Action("Team", "Dashboard") + "'")); }
// POST OAuth/SaveUserAccount public async Task <ActionResult> SaveUserAccount() { GetUser(out _, out ApplicationUser user); FacebookAccountViewModel account = (await FacebookAuthenticator.GetPageAuthTokens(user.FbUserAccount.helper_access_token, Request.Form["id"])) .SingleOrDefault(); account = account ?? await FacebookAuthenticator.GetUserAccount(user.FbUserAccount.helper_access_token); account = account.Id == Request.Form["id"] ? account : null; if (account == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Something went wrong, please make sure that you have selected an account.")); } user.FbUserAccount.AccountId = account.Id; user.FbUserAccount.AccountName = account.Name; user.FbUserAccount.account_access_token = account.access_token; _context.SaveChanges(); return(JavaScript("window.location = '" + Url.Action("Accounts", "Dashboard") + "'")); }
public JsonResult LogarPeloFacebook(FacebookAccountViewModel facebookLogin) { DAOUsuarioProfissional daoUsuarioProfissional = null; UsuarioProfissional usuarioProfissional = null; string urlGetOpenGraphAccesToken; HttpWebRequest accessTokenRequest = null; HttpWebResponse accessTokenResponse = null; string accessTokenResponseText = null; string accessToken = null; string urlCheckUserAccessToken; string checkAccessTokenResponseText; DAOFacebookAccount daoFacebookAccount = null; FacebookAccount facebookAccount = null; DAOUsuario daoUsuario = null; Usuario usuario = null; DAOUsuarioParticular daoUsuarioParticular = null; UsuarioParticular usuarioParticular = null; try { urlGetOpenGraphAccesToken = @"https://graph.facebook.com/oauth/access_token?type=client_cred&client_id=1753687224853096&client_secret=6af778d15f3ce0ffa2b4e1acdcede3a9"; accessTokenRequest = (HttpWebRequest)WebRequest.Create(urlGetOpenGraphAccesToken); accessTokenResponse = (HttpWebResponse)accessTokenRequest.GetResponse(); using (var accessTokenResponseReader = new System.IO.StreamReader(accessTokenResponse.GetResponseStream(), Encoding.UTF8)) { accessTokenResponseText = accessTokenResponseReader.ReadToEnd(); } accessToken = accessTokenResponseText.Substring(13); //Buscar uma maneira melhor de fazer isto (extrair o token da string). urlCheckUserAccessToken = String.Format("https://graph.facebook.com/debug_token?input_token={0}&access_token={1}", facebookLogin.AccessToken, accessToken); HttpWebRequest checkUserAccessTokenRequest = (HttpWebRequest)WebRequest.Create(urlCheckUserAccessToken); HttpWebResponse checkUserAccessTokenResponse = (HttpWebResponse)checkUserAccessTokenRequest.GetResponse(); if (checkUserAccessTokenResponse.StatusCode == HttpStatusCode.OK) { using (var checkAccessTokenResponseReader = new System.IO.StreamReader(checkUserAccessTokenResponse.GetResponseStream(), Encoding.UTF8)) { checkAccessTokenResponseText = checkAccessTokenResponseReader.ReadToEnd(); } Newtonsoft.Json.Linq.JObject jsonCheckAccessTokenResponse = JsonConvert.DeserializeObject(checkAccessTokenResponseText) as Newtonsoft.Json.Linq.JObject; if (jsonCheckAccessTokenResponse["data"]["is_valid"].ToString() == "True") { if (jsonCheckAccessTokenResponse["data"]["app_id"].ToString() == "1753687224853096") { if (jsonCheckAccessTokenResponse["data"]["user_id"].ToString() == facebookLogin.Id) { daoFacebookAccount = new DAOFacebookAccount(); // Tenta obter um "FacebookAccount" no banco de dados, checando se é um usuário retornante. facebookAccount = daoFacebookAccount.ObterFacebookAccount(facebookLogin.Id); if (facebookAccount != null) // Se o "facebookAccount" entrar na condição de "não nulo", ou seja, foi encontrada uma instância com o mesmo "FacebookId" no banco de dados, o usuário em questão é considerado retornante, não é a primeira vez que ele loga via Facebook. { // Obtém o complemento dos dados, caso o usuário seja um particular (obtém-se na tabela "UsuariosParticulares"). if (facebookAccount.Usuario.Perfil == Usuario.TipoPerfil.UsuarioParticular) { daoUsuarioParticular = new DAOUsuarioParticular(); usuarioParticular = daoUsuarioParticular.ObterUsuarioParticular(facebookAccount.Usuario.Id); usuarioParticular.Facebook = facebookAccount; facebookAccount.Usuario = usuarioParticular; Session["Usuario"] = usuarioProfissional; return(Json(new { info = "redirect", data = Url.Action("UsuarioParticular", "Perfil") })); } // Obtém o complemento dos dados, caso o usuário seja um profissional (obtém-se na tabela "UsuáriosProfissionais"). else if (facebookAccount.Usuario.Perfil == Usuario.TipoPerfil.UsuarioProfissional) { daoUsuarioProfissional = new DAOUsuarioProfissional(); usuarioProfissional = daoUsuarioProfissional.ObterUsuarioProfissional(facebookAccount.Usuario.Id); usuarioProfissional.Facebook = facebookAccount; facebookAccount.Usuario = usuarioProfissional; Session["Usuario"] = usuarioProfissional; return(Json(new { info = "redirect", data = Url.Action("UsuarioProfissional", "Perfil") })); } } else // Neste caso, não foi encontrado nenhum registro no banco com este "FacebookId", assumindo que este usuário entrou pelo Facebook pela primeira vez. { daoUsuario = new DAOUsuario(); // Busca-se por um registro de usuário com o e-mail retornado pelo Facebook, para descobrir se esta pessoa já tinha um cadastro tradicional (entrava com e-mail e senha anteriormente). usuario = daoUsuario.ObterUsuarioPorEmail(facebookLogin.Email); if (usuario != null) { // Neste caso, apesar de o usuário ter logado pela primeira vez via Facebook, o e-mail que o Facebook retornou já consta em um perfil na tabela "Usuarios" (ele já havia logado via e-mail/senha tradicionalmente). // Este usuário deve ser informado disto e informar a senha referente ao e-mail encontrado para poder prosseguir no site. Session["Usuario"] = usuario; return(Json(new { info = "exigirSenhaEmailEncontrado" })); } else { // Neste caso, o usuário será tratado como um usuário inédito, ou seja, é a primeira vez que o mesmo logou no sistema e escolheu o fazer via Facebook, pois o seu "FaceBookId" não consta na tabela "FacebookAccounts" e seu e-mail obtido do Facebook também não consta na tabela de "Usuarios". Este usuário será incluído com o perfil "Indefinido" (temporariamente), e perguntado com qual tipo de perfil ele deseja prosseguir. usuario = new Usuario(); usuario.Nome = facebookLogin.Nome; usuario.Email = facebookLogin.Email; usuario.Facebook = new FacebookAccount(); usuario.Facebook.FacebookId = facebookLogin.Id; usuario.Facebook.Nome = facebookLogin.Nome; usuario.Facebook.Email = facebookLogin.Email; usuario.Facebook.AccessToken = facebookLogin.AccessToken; usuario.Perfil = Usuario.TipoPerfil.PerfilIndefinido; if (daoUsuario.IncluirUsuarioComFacebook(usuario)) { Session["Usuario"] = usuario; } return(Json(new { info = "solicitarDefinicaoPerfil" })); } } } } } } return(Json(new { info = "naoDefinido" })); } catch (Exception ex) { throw ex; } }