I am assuming you have already got Client Secret and Client Id from Google Plus Api.
Now in Startup.Auth.cs remove the below code
Now in Startup.Auth.cs remove the below code
//app.UseFacebookAuthentication( // appId: "", // appSecret: "");and paste this
var googleOptions = new GoogleOAuth2AuthenticationOptions() { ClientId = "9ac07032788-agi11p78tp105iqkodc8tebie14jbd7i.apps.googleusercontent.com", ClientSecret = "B1cvuBL5rBPUNh1molEBkVLVl", Provider = new GoogleOAuth2AuthenticationProvider() { OnAuthenticated = (context) => { context.Identity.AddClaim(new Claim("urn:google:name", context.Identity.FindFirstValue(ClaimTypes.Name))); context.Identity.AddClaim(new Claim("urn:google:email", context.Identity.FindFirstValue(ClaimTypes.Email))); //This following line is need to retrieve the profile image context.Identity.AddClaim(new System.Security.Claims.Claim("urn:google:accesstoken", context.AccessToken, ClaimValueTypes.String, "Google")); return Task.FromResult(0); } } }; app.UseGoogleAuthentication(googleOptions);And in AccountController.cs change the method ExternalLoginCallback as
// GET: /Account/ExternalLoginCallback [AllowAnonymous] public async TaskNow you can access image anywhere in project, because we have put it in Session variable. To show image, you can try thisExternalLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } var accessToken = loginInfo.ExternalIdentity.Claims.Where(c => c.Type.Equals("urn:google:accesstoken")).Select(c => c.Value).FirstOrDefault(); Uri apiRequestUri = new Uri("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + accessToken); dynamic userPicture; //request profile image using (var webClient = new System.Net.WebClient()) { var json = webClient.DownloadString(apiRequestUri); dynamic resul = JsonConvert.DeserializeObject(json); userPicture = resul.picture; } this.Session["userPicture"] = userPicture; // Sign in the user with this external login provider if the user already has a login var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); switch (result) { case SignInStatus.Success: return RedirectToLocal(returnUrl); case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false }); case SignInStatus.Failure: default: // If the user does not have an account, then prompt the user to create an account ViewBag.ReturnUrl = returnUrl; ViewBag.LoginProvider = loginInfo.Login.LoginProvider; return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email }); } //get access token to use in profile image request }
@{ ViewBag.Title = "About"; } @ViewBag.Title @ViewBag.MessageIt will look something like this@HttpContext.Current.Session["userPicture"]@HttpContext.Current.Session["hello"] Use this area to provide additional information.
This is your image
Good article. Hope that you will soon update it to get image from facebook as well.
ReplyDeleteThx bro. I have been looking for it for a long time for google information with .net :)
ReplyDelete