我正在尝试通过Google验证用户。
我正在使用Vue和ASP.NET Core的ABP启动模板。
目前,我已经完成了以下工作:
我在Web.Core中创建了一个名为
我在Web.Host的AuthConfigurer.cs文件中注册了Google外部认证。
我已经将设置添加到Web.Host中的appsettings.json文件中,并在Secret Manager工具中创建了相应的秘密(ClientId和ClientSecret)。
我使用RequireHttpsAttribute强制API使用SSL。
我在[ProjectName]WebCoreModule.cs中注册了GoogleAuthProviderApi。
我不知道我在这里缺少什么,也不知道应该期望什么。
我本以为调用 api/TokenAuth/GetExternalAuthenticationProviders 端点至少会给我一个包含 Google 的列表,但是这个请求返回的结果是一个空数组。
此外,对于像 Google 和 Facebook 这样的 OAuth 提供者,这种外部身份验证的范围对我来说有点不清楚。看起来你要么有用于服务器端使用的 OAuth,在这种情况下,我不明白为什么你要通过 API 暴露它的一部分。要么你有用于 JavaScript Web 应用程序的 OAuth,在这种情况下,你不需要自己服务器上的 API 端点,你只需要通过 Web 应用程序客户端在整个过程中处理即可。
那么,外部身份验证 API 端点确切的目的是什么?是让你自己的服务器充当身份验证代理吗?所以你既可以在客户端和服务器端使用外部 (Google) API?
更新1:
评论要求我澄清一些内容。
#1: 如果我在 Postman 中添加 Abp.TenantId 标头,响应仍然相同:
目前,我已经完成了以下工作:
我在Web.Core中创建了一个名为
GoogleAuthProviderApi
的API。using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.Google;
using Newtonsoft.Json.Linq;
namespace Mindbus.MindbooksSEO.Authentication.External.Google
{
public class GoogleAuthProviderApi : ExternalAuthProviderApiBase
{
public const string Name = "Google";
public override async Task<ExternalAuthUserInfo> GetUserInfo(string accessCode)
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.UserAgent.ParseAdd("Microsoft ASP.NET Core OAuth middleware");
client.DefaultRequestHeaders.Accept.ParseAdd("application/json");
client.Timeout = TimeSpan.FromSeconds(30);
client.MaxResponseContentBufferSize = 1024 * 1024 * 10; // 10 MB
var request = new HttpRequestMessage(HttpMethod.Get, GoogleDefaults.UserInformationEndpoint);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessCode);
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var payload = JObject.Parse(await response.Content.ReadAsStringAsync());
return new ExternalAuthUserInfo
{
//Name = GoogleHelper.GetName(payload),
EmailAddress = GoogleHelper.GetEmail(payload),
//Surname = GoogleHelper.GetFamilyName(payload),
//ProviderKey = GoogleHelper.GetId(payload),
Provider = Name
};
}
}
}
}
我在Web.Host的AuthConfigurer.cs文件中注册了Google外部认证。
if (bool.Parse(configuration["Authentication:Google:IsEnabled"]))
{
services.AddAuthentication().AddGoogle(googleOptions =>
{
googleOptions.ClientId = configuration["Authentication:Google:ClientId"];
googleOptions.ClientSecret = configuration["Authentication:Google:ClientSecret"];
});
}
我已经将设置添加到Web.Host中的appsettings.json文件中,并在Secret Manager工具中创建了相应的秘密(ClientId和ClientSecret)。
我使用RequireHttpsAttribute强制API使用SSL。
我在[ProjectName]WebCoreModule.cs中注册了GoogleAuthProviderApi。
public override void PreInitialize()
{
Configuration.DefaultNameOrConnectionString = _appConfiguration.GetConnectionString(
MindbooksSEOConsts.ConnectionStringName
);
// Use database for language management
Configuration.Modules.Zero().LanguageManagement.EnableDbLocalization();
Configuration.Modules.AbpAspNetCore()
.CreateControllersForAppServices(
typeof(MindbooksSEOApplicationModule).GetAssembly()
);
ConfigureTokenAuth();
Configuration.Modules.Zero().UserManagement.ExternalAuthenticationSources.Add<GoogleAuthProviderApi>();
}
我不知道我在这里缺少什么,也不知道应该期望什么。
我本以为调用 api/TokenAuth/GetExternalAuthenticationProviders 端点至少会给我一个包含 Google 的列表,但是这个请求返回的结果是一个空数组。
此外,对于像 Google 和 Facebook 这样的 OAuth 提供者,这种外部身份验证的范围对我来说有点不清楚。看起来你要么有用于服务器端使用的 OAuth,在这种情况下,我不明白为什么你要通过 API 暴露它的一部分。要么你有用于 JavaScript Web 应用程序的 OAuth,在这种情况下,你不需要自己服务器上的 API 端点,你只需要通过 Web 应用程序客户端在整个过程中处理即可。
那么,外部身份验证 API 端点确切的目的是什么?是让你自己的服务器充当身份验证代理吗?所以你既可以在客户端和服务器端使用外部 (Google) API?
更新1:
评论要求我澄清一些内容。
#1: 如果我在 Postman 中添加 Abp.TenantId 标头,响应仍然相同:
GET /api/TokenAuth/GetExternalAuthenticationProviders HTTP/1.1
Host: localhost:44300
Accept: application/json
Abp.TenantId: 2
Cache-Control: no-cache
Postman-Token: 0cb72e57-4b9a-474d-b60d-492fa727a7a2
#2: Swagger中控制台的“技巧”导致错误:
abp.swagger.login()
undefined
VM40:49 POST https://localhost:44300/api/TokenAuth/Authenticate 500 ()
abp.swagger.login @ VM40:49
(anonymous) @ VM84:1
abp.swagger.addAuthToken()
false
更新2
我认为GoogleAuthProviderApi
出了些问题。在我让调试器中断所有CLR异常后,我捕获了以下错误:
'Mindbus.MindbooksSEO.Authentication.External.Google.GoogleAuthProviderApi' to type
'Abp.Authorization.Users.IExternalAuthenticationSource`2
[Mindbus.MindbooksSEO.MultiTenancy.Tenant,
Mindbus.MindbooksSEO.Authorization.Users.User]'.'
GetExternalAuthenticationProviders
方法时,您是否发送了Abp.TenantId
标头? - aaron