我已经实现了 OpenID Connect 服务器,它使用OpenIddict根据用户名/密码为移动客户端生成访问令牌。我的下一个目标是提供使用 3-rd 方令牌(例如社交登录)生成访问令牌的能力,我从与 Google 令牌集成开始,但由于找不到任何有关如何执行此操作的示例/信息而陷入困境。
我目前唯一的想法是向“/connect/token”端点发出请求并以“code”参数发送谷歌令牌,例如以“google:”格式,然后覆盖OpenIdConnectServerProvider.DeserializeAuthorizationCode方法:
收到授权码时调用。应用程序可以使用此上下文使用自定义格式反序列化代码,并使用以下方式跳过默认逻辑
所以我创建了自己的CustomProvider类OpenIddictProvider,注册它
services.AddOpenIddict<ApplicationUser, ApplicationRole, ApplicationDbContext, int>()
.Configure(builder =>
{ builder.Provider = new CustomProvider(sp.GetRequiredService<SignInService>()); }
并覆盖该DeserializeAuthorizationCode方法:
public override async Task DeserializeAuthorizationCode(DeserializeAuthorizationCodeContext context)
{
string code = context.Request.Code;
if (code.StartsWith("google:"))
{
string token = code.Replace("google:", "");
var principal = new GoogleTokenValidator().ValidateToken(token, null).Result;
var ticket = new AuthenticationTicket(principal, new AuthenticationProperties(), "Bearer");
ticket.SetPresenters(context.Request.ClientId);
context.Ticket = ticket;
context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddDays(1);
context.HandleResponse();
await _signInService.Login(principal);
return;
}
else
{
base.DeserializeAuthorizationCode(context);
}
}
whereGoogleTokenValidator是用于 Google 令牌处理的自定义类(它调用 Google 用户信息端点并生成 ClaimsPrincipal),基于aspnet/Security repo 中GoogleHandler类的“复制粘贴”代码。
总的来说,它正在使用一些额外的技巧,但我有强烈的感觉,重新发明轮子......