OpenIddict을 사용하여 사용자 이름/비밀번호를 기반으로 모바일 클라이언트에 대한 액세스 토큰을 생성하는 OpenID Connect 서버를 구현했습니다. 다음 목표는 제 3 자 토큰 (예 : 소셜 로그인)을 사용하여 액세스 토큰을 생성하는 기능을 제공하는 것이 었습니다. Google 토큰과의 통합에서 시작되었지만이를 수행하는 방법에 대한 샘플/정보를 찾을 수 없어 막혔습니다.OpenID Connect 서버. 제 3 자 토큰 (소셜 로그인)을 기반으로 액세스 토큰 생성
나는 현재 엔드 포인트 "//토큰을 연결"를 예를 들면, "코드"매개 변수에 구글 토큰을 보내도록 요청을하는 것입니다 가지고있는 단 하나 개의 아이디어를 "구글"형식, 다음 OpenIdConnectServerProvider.DeserializeAuthorizationCode 메소드를 오버라이드 (override) :
인증 코드를 받으면 호출됩니다. 응용 프로그램은 사용자 정의 형식을 사용하여 코드를 역 직렬화이 컨텍스트를 사용할 수 있으며,
OpenIddictProvider
에 따라
그래서 내가 만든 자신의 CustomProvider
클래스를 사용하여 기본 논리를 건너,
services.AddOpenIddict<ApplicationUser, ApplicationRole, ApplicationDbContext, int>()
.Configure(builder =>
{ builder.Provider = new CustomProvider(sp.GetRequiredService<SignInService>()); }
그것을 등록하고를 오버라이드 (override) 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);
}
}
GoogleTokenValidator
구글의 사용자 정의 클래스가 처리 토큰입니다 (이것은 구글 사용자에게 호출을 정보 끝점을 생성하고 ClaimsPrincipal을 생성), aspnet/Security repo에서 GoogleHandler 클래스의 "복사 붙여 넣기"코드를 기반으로합니다.
,하지만 난 바퀴를 개혁한다는 강한 느낌이 ... 그것은 몇 가지 추가 해킹과 협력 일반적으로
"사용자를 로그인 끝점으로 리디렉션합니다."하지만 모바일 클라이언트가 있고 브라우저를 열지 않으려면 어떻게해야합니까? 모바일 클라이언트에는 Google/facebook 등에 로그인 할 때 액세스 토큰을 반환하는 "내장 된"소셜 로그인 양식이 있습니다. 그런 다음 내 토큰과 교환하기 만하면됩니다. – Set
'그리고 나는 그것을 내 토큰으로 교환하기를 원합니다 .'> OpenIddict에서는 표준이 아니기 때문에 그것을 지원할 방법이 없습니다. IETF는 현재 새로운 초안 (https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-05)에서 작업하고 있지만 OpenIddict와 외부 공급자 (여기서는 Google) 그것을 구현하십시오. – Pinpoint
ok ... 나는 초안에 대한 링크를보고 고마워합니다. – Set