private async Task <ReturnSignUserResponse> MakeDecisionAsync(User user, bool isExternal, ReturnUrlRequest?returnUrl, CancellationToken token) { if (user.PhoneNumberConfirmed) { if (isExternal) { await _signInManager.SignInAsync(user, false); return(ReturnSignUserResponse.SignIn()); // return new ReturnSignUserResponse(false); } throw new ArgumentException(); } if (user.PhoneNumber != null) { var t1 = _signInManager.TempSignIn(user); var t2 = _client.SendSmsAsync(user, token); await Task.WhenAll(t1, t2); return(new ReturnSignUserResponse(RegistrationStep.RegisterVerifyPhone, new { phoneNumber = user.PhoneNumber })); } if (user.EmailConfirmed) { await _signInManager.TempSignIn(user); return(new ReturnSignUserResponse(RegistrationStep.RegisterSetPhone)); } await GenerateEmailAsync(user, returnUrl, token); return(new ReturnSignUserResponse(RegistrationStep.RegisterEmailConfirmed)); }
public async Task <ActionResult <ReturnSignUserResponse> > GoogleSignInAsync( [FromBody] GoogleTokenRequest model, [FromServices] IGoogleAuth service, [FromServices] IUserDirectoryBlobProvider blobProvider, [FromServices] TelemetryClient logClient, [FromServices] IHttpClientFactory clientFactory, CancellationToken cancellationToken) { var result = await service.LogInAsync(model.Token, cancellationToken); _logger.Info($"received google user {result}"); if (result == null) { logClient.TrackTrace("result from google is null"); ModelState.AddModelError("Google", _localizer["GoogleNoResponse"]); return(BadRequest(ModelState)); } var result2 = await _signInManager.ExternalLoginSignInAsync("Google", result.Id, true, true); if (result2.Succeeded) { return(ReturnSignUserResponse.SignIn()); //return new ReturnSignUserResponse(false); } if (result2.IsLockedOut) { logClient.TrackTrace("user is locked out"); ModelState.AddModelError("Google", _loginLocalizer["LockOut"]); return(BadRequest(ModelState)); } var user = await _userManager.FindByEmailAsync(result.Email); if (result2.IsNotAllowed && user != null && await _userManager.IsLockedOutAsync(user)) { ModelState.AddModelError("Google", _loginLocalizer["LockOut"]); return(BadRequest(ModelState)); } if (user == null) { var country = await _countryProvider.GetUserCountryAsync(cancellationToken); user = new User(result.Email, result.FirstName, result.LastName, result.Language, country) { EmailConfirmed = true }; var result3 = await _userManager.CreateAsync(user); if (result3.Succeeded) { if (!string.IsNullOrEmpty(result.Picture)) { using var httpClient = clientFactory.CreateClient(); var message = await httpClient.GetAsync(result.Picture, cancellationToken); await using var sr = await message.Content.ReadAsStreamAsync(); var mimeType = message.Content.Headers.ContentType; try { var uri = await blobProvider.UploadImageAsync(user.Id, result.Picture, sr, mimeType.ToString(), cancellationToken); var imageProperties = new ImageProperties(uri, ImageProperties.BlurEffect.None); var url = Url.ImageUrl(imageProperties); var fileName = uri.AbsolutePath.Split('/').LastOrDefault(); user.UpdateUserImage(url, fileName); } catch (ArgumentException e) { logClient.TrackException(e, new Dictionary <string, string>() { ["FromGoogle"] = result.Picture }); } } await _userManager.AddLoginAsync(user, new UserLoginInfo("Google", result.Id, result.Name)); return(await MakeDecisionAsync(user, true, null, cancellationToken)); } logClient.TrackTrace($"failed to register {string.Join(", ", result3.Errors)}"); ModelState.AddModelError("Google", _localizer["GoogleUserRegisteredWithEmail"]); return(BadRequest(ModelState)); } if (!user.EmailConfirmed) { user.EmailConfirmed = true; await _userManager.UpdateAsync(user); } await _userManager.AddLoginAsync(user, new UserLoginInfo("Google", result.Id, result.Name)); return(await MakeDecisionAsync(user, true, null, cancellationToken)); }