2016-07-15 2 views
1

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 클래스의 "복사 붙여 넣기"코드를 기반으로합니다.

이 몇 가지 추가 해킹과 협력 일반적으로

,하지만 난 바퀴를 개혁한다는 강한 느낌이 ... 그것은 몇 가지 추가 해킹과 협력 일반적으로

답변

1

,하지만 난을 개혁한다는 강한 느낌이 휠 ...

당신은 휠을 재발 명할뿐만 아니라 OpenIddict가 전혀 지원하지 않는 완전히 표준이 아닌 것을 구현하고 있습니다. 여기

내가 (우리가 MVC 서버 샘플에서 사용하는 하나입니다) 권장 접근 방식 :

  • OAuth2를/오픈 ID Connect 클라이언트 응용 프로그램이 권한 부여 컨트롤러에 사용자 에이전트를 리디렉션 (당신이 걸릴 수 있습니다 예를 들어 this controller을보십시오).

  • OpenIddict는 승인 요청의 유효성을 검사하고 컨트롤러가 완전히 유효하면 컨트롤러를 호출 할 수있게합니다.

  • 사용자가 아직 로그인하지 않은 경우 인증 컨트롤러는 AccountController에 의해 제공되는 로그인 끝점으로 사용자를 리디렉션합니다. 이 시점에서 로컬 인증 (예 : 사용자 이름/비밀번호 커플 사용) 또는 Google 인증 (Google 인증 미들웨어를 사용할 수 있음)을 자유롭게 제안 할 수 있습니다. 이 로그인 프로세스의 일부로 2-FA를 제공 할 수도 있습니다.

  • 사용자가 로그인하면 (예 : 등록 프로세스 및/또는 외부 인증 연결 후) 사용자의 브라우저가 인증 엔드 포인트로 다시 리디렉션됩니다. 여기서 사용자의 브라우저는 승인 엔드 포인트로 리디렉션됩니다. JS 앱이 자신의 개인 데이터에 액세스 할 수 있도록 표시됩니다.

  • 사용자가 클라이언트 응용 프로그램에서 자신의 데이터에 액세스 할 수있게하면 승인 컨트롤러가 요청을 처리하여 SignInAsync을 호출하여 인증 코드/액세스 토큰이 응용 프로그램에 반환되어야 함을 OpenIddict에 알립니다.

+1

"사용자를 로그인 끝점으로 리디렉션합니다."하지만 모바일 클라이언트가 있고 브라우저를 열지 않으려면 어떻게해야합니까? 모바일 클라이언트에는 Google/facebook 등에 로그인 할 때 액세스 토큰을 반환하는 "내장 된"소셜 로그인 양식이 있습니다. 그런 다음 내 토큰과 교환하기 만하면됩니다. – Set

+0

'그리고 나는 그것을 내 토큰으로 교환하기를 원합니다 .'> OpenIddict에서는 표준이 아니기 때문에 그것을 지원할 방법이 없습니다. IETF는 현재 새로운 초안 (https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-05)에서 작업하고 있지만 OpenIddict와 외부 공급자 (여기서는 Google) 그것을 구현하십시오. – Pinpoint

+0

ok ... 나는 초안에 대한 링크를보고 고마워합니다. – Set