Застрял в URL -адресе Callback после входа в Google в WebView; Аутентификация не перенаправляетC#

Место общения программистов C#
Ответить
Anonymous
 Застрял в URL -адресе Callback после входа в Google в WebView; Аутентификация не перенаправляет

Сообщение Anonymous »

Я интегрирую вход в Google в своем приложении Web/Vue.js. Я использую API для обработки аутентификации. Все работает до такой степени, что пользователь аутентифицируется: в моей функции hardgooglecallback я получаю URL с информацией о аутентификации. /> Пользователь должен быть перенаправлен автоматически после успешной аутентификации. < /p>
Сеанс должен быть установлен, и пользователь вошел в систему. (https://orbis-api-web.azurewebsites.net ... ope=email+ Профиль+https%3a%2f%2fwww.googleapis.com%2fauth%2fuserinfo.profile+openid+https%3a%2f%2fwww.googleapis.com%2fauth%2fuserinfo.email & authuser = 0 & romplet = no)
Информация о аутентификации виден в URL. < /p>
Нет перенаправления или входа в систему.

Код: Выделить всё

  mounted() {
this.initializeMsal();
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.has('code') && urlParams.has('state') && urlParams.get('state') === 'google') {
this.handleGoogleCallback();
}
},
async googleClicked() {
try {
const response = await axios.get(`${this.ApiUrl}/GoogleSignIn/GoogleLogin`);

if (response.status === 200) {
const googleLoginUrl = response.data;
window.location.href = googleLoginUrl;
} else {
console.error('Failed to get Google login URL', response.statusText);
}
} catch (error) {
console.error('Error during Google login', error);
}
},
async handleGoogleCallback() {
const urlParams = new URLSearchParams(window.location.search);
const code = urlParams.get('code');
if (!code) {
console.error('No code found in URL');
return;
}

try {
const response = await axios.post(`${this.ApiUrl}/GoogleSignIn/AccessToken`, {
code: code,
});

if (response.status === 200) {
const tokenData = response.data;
await this.validateTokenWithBackend(tokenData.access_token);
} else {
console.error('Failed to get Google access token', response.statusText);
}
} catch (error) {
console.error('Error during Google token exchange', error);
}
},
async validateGoogleTokenWithBackend(accessToken) {
try {
const googleResponse = await axios.get('https://www.googleapis.com/oauth2/v2/userinfo', {
headers: {
Authorization: `Bearer ${accessToken}`,
},
});

const userData = googleResponse.data;

const formData = new FormData();
formData.append('id', userData.id);
formData.append('email', userData.email);
formData.append('name', userData.name);
formData.append('picture', userData.picture || ''); // optionnel

const response = await axios.post(`${this.ApiUrl}/api/v1/users/ValidateGoogleUserAccount`, formData);

if (response.status === 200) {
this.$store.commit('setUser', response.data);
localStorage.setItem('user', JSON.stringify(response.data));
this.$router.go(-1);
} else {
console.error('Backend validation failed', response.statusText);
}
} catch (error) {
console.error('Error during Google token validation', error);
}
},

api
public class GoogleSignInController : Controller
{
private readonly DataContext _context;
private readonly IGoogleSignInRepository _googleSignInRepository;
private readonly IConfiguration _configuration;

public GoogleSignInController(DataContext context, IGoogleSignInRepository googleSignInRepository, IConfiguration configuration)
{
_context = context;
_googleSignInRepository = googleSignInRepository;
_configuration = configuration;
}

[AllowAnonymous]
[HttpGet]
public async Task GoogleLogin()
{
try
{
var googleUrl = await _googleSignInRepository.GoogleLogin();
if (googleUrl != null)
return Ok(googleUrl);
else
return NotFound(new { message = "Error while google login" });
}
catch (Exception ex)
{
return StatusCode(500, "Internal Server Error");
}
}

[HttpGet]
[AllowAnonymous]
public async Task AccessToken()
{
string? code = HttpContext.Request.Query["code"];
string redirectUri = _configuration["GoogleCredentials:redirectUri"];
string clientId = _configuration["GoogleCredentials:clientId"];
string clientSecret = _configuration["GoogleCredentials:clientSecret"];
string googleRequest = $"https://www.googleapis.com/oauth2/v4/to ... edirectUri}";
try
{
string? response = await _googleSignInRepository.GetEmailTokenResponce(googleRequest);
var tokenResponse = JsonConvert.DeserializeObject(response);
string token = tokenResponse.AccessToken;

var userInfoResponse = await GetUserProfile(token);
return userInfoResponse;
}
catch (Exception ex)
{
return StatusCode(500, $"Error: {ex.Message}");
}
}

[HttpGet]
[AllowAnonymous]
public async Task GetUserProfile(string token)
{
string userInfoUrl = "https://www.googleapis.com/oauth2/v2/userinfo";
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
HttpResponseMessage response = await client.GetAsync(userInfoUrl);
if (response.IsSuccessStatusCode)
{
string json = await response.Content.ReadAsStringAsync();
return Ok(json);
}
else
return StatusCode((int)response.StatusCode, response.ReasonPhrase);
}
}
}

public class TokenResponse
{
[JsonProperty("access_token")]
public string AccessToken { get; set; }

[JsonProperty("expires_in")]
public int ExpiresIn { get; set; }

[JsonProperty("refresh_token")]
public string RefreshToken { get; set; }

[JsonProperty("scope")]
public string Scope { get; set; }

[JsonProperty("token_type")]
public string TokenType { get; set; }
}

< /code>
Я попробовал несколько подходов, чтобы решить эту проблему. Моя идея состояла в том, чтобы определить, когда обратный вызов Google возвращался с помощью данных аутентификации, затем немедленно анализируя параметры и заполнить поток входа в систему. Я использовал оба этого. $ Router.push (...) и window.location.href = ... чтобы попытаться перенаправить, но в обоих случаях приложение просто осталось на URL -обратном вызове.

Подробнее здесь: https://stackoverflow.com/questions/797 ... es-not-red
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»