我有一个问题与谷歌oauth2的实现。我得到一个重定向missmatch。
我在谷歌控制台https://localhost:4200/signin-google.
我的困惑是这样的.如果我做https://localhost:4200/API/google/response在谷歌控制台和options. CallbackPath.然后我成功地重定向的挑战,但/API/google/response从来没有得到触发在谷歌的中间件认证.(我有各种控制台,将不会打印).它也是成功的,因为我得到了一个cookie与我的谷歌信息,如姓名,电子邮件等.
很多教程只是将谷歌控制台设置为https://localhost:4200/signin-google。他们从不设置选项.CallbackPath或任何http:localhost/signin-google路由,他们在我收到错误400:redirect_uri_mismatch时成功播放(这是正确的,因为我的应用程序没有https://localhost:4200/signin-google)。
我应该回到谷歌控制台上的https://localhost:4200/API/google/response,并将CallbackPath设置为**/API/google/response**,看看为什么它不触发?
我应该在我的应用程序中添加route到**/singin-google吗?
为什么在许多教程中没有路由和CallbackPath**工作,而在我的情况下只是没有?
先谢谢你了。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// configurations
services.Configure<EnvironmentVariables>(Configuration.GetSection(EnvironmentVariables.EnvironmentVariable));
services.Configure<RabbitMQSettingsOptions>(Configuration.
GetSection(RabbitMQSettingsOptions.RabbitMQSettings));
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
this.SetUpCookieAuthentication(options);
});
services.AddAuthentication().AddGoogle(options =>
{
this.SetUpGoogleAuthentication(options);
});
services.AddCors(options =>
{
this.SetUpCorsPolicy(options);
});
...
}
private void SetUpGoogleAuthentication(GoogleOptions options)
{
...
// set GoogleOptions
//options.CallbackPath = new PathString(path);
options.ClientSecret = googleAuthentication.ClientSecret;
options.ClientId = googleAuthentication.ClientId;
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//app.UseHttpsRedirection();
app.UseRouting();
app.UseCors("CorsPolicy");
// app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.UseCookiePolicy();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
字符串
GoogleController.cs
using AutoMapper.Internal;
using Domain.DDtos.Users;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.Google;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using ServiceLayer.Dtos.Users;
using ServiceLayer.Interfaces;
using ServiceLayer.Services;
using ServiceLayer.Types;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
namespace Eshop.Controllers
{
[Route("api/google")]
[ApiController]
public class GoogleController : ControllerBase
{
private IOptions<EnvironmentVariables> _envOptions;
private readonly IEnvironmentVariableService _envService;
private readonly IUserService _userService;
public GoogleController(IOptions<EnvironmentVariables> envOptions,
IEnvironmentVariableService envService, IUserService userService)
{
_envOptions = envOptions;
_envService = envService;
_userService = userService;
}
[HttpGet("signin")]
public async Task<ActionResult> GetGoogleSignInAsync()
{
var googleAuthenticationFile = await _envService.GetEnvironmentVariableValueAsync(_envOptions.Value.GoogleAuthentication);
if (googleAuthenticationFile == null)
throw new Exception("Could not find the actual google authentication file.");
var googleAuthentication = JsonConvert.DeserializeObject<OAuth2Credentials>(googleAuthenticationFile);
var redirectUri = googleAuthentication.RedirectUris.FirstOrDefault();
var properties = new AuthenticationProperties
{
RedirectUri = Url.Action("GoogleResponseAsync")
};
return Challenge(properties, GoogleDefaults.AuthenticationScheme);
}
[HttpGet("response")]
public async Task<ActionResult> GoogleResponseAsync()
{
Console.WriteLine("in response");
var result = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
if (!result.Succeeded)
return Unauthorized();
Debug.WriteLine(JsonConvert.SerializeObject(result));
var userLinkDto = new UserLinkDto();
var claims = result.Principal.Identities.FirstOrDefault().Claims.Select(claim => new
{
claim.Issuer,
claim.OriginalIssuer,
claim.Type,
claim.Value,
});
claims.ForAll(claim =>
{
var claimType = Constants.GoogleClaimsDict.GetValueOrDefault(claim.Type);
var dtoProp = claimType != null ? userLinkDto.GetType().GetProperty(claimType) : null;
if (dtoProp != null)
dtoProp.SetValue(userLinkDto, claim.Value);
});
return Ok();
}
型
2条答案
按热度按时间lx0bsm1f1#
错误400:redirect_uri_mismatch(这是正确的,因为我的应用程序没有https://localhost:4200/signin-google)。
redirect_uri_mismatch并不意味着您的应用程序没有
https://localhost:4200/signin-google
,而是意味着您没有在Google开发人员控制台中为您的应用程序配置重定向URI作为有效的重定向URI。How the fix redirect_uri_mismatch error.
ddrv8njm2#
好吧,这个问题被分成两部分。第一个是我需要等待几个小时才能让谷歌控制台接受授权重定向网址到https://localhost:4200/signin-google的更改。这就是为什么我会得到重定向missmatch。
第二个问题,出现在上述修复后,这是一个无限次的/API/谷歌/登录请求谷歌是因为这一部分
RedirectUri = Url.Action(“GoogleResponseAsync”)
在以Async结尾的操作中,我需要给予没有Async部分的操作,否则我不会得到有效的URL。
修复:
RedirectUri = Url.Action(“GoogleResponse”)
错误链接:https://github.com/dotnet/aspnetcore/issues/14606
这就是为什么我在没有CallbackPath的情况下遵循教程时遇到了很多问题,并且我收到了奇怪的无限请求。此外,在创建访问令牌后,您想要运行的最终URL必须在挑战中设置,而不是在Google控制台-> authorized_redirect_url或您的CallbackPath中设置,因为CallbackPath仅供内部使用。