3

Google 앱은 휴대 전화 번호 또는 Google에서 로그인해야합니다. 우리는 모바일 번호 인증을 위해 Twitter Digits를 계획하고 있습니다.Rich Digits/Google Auth with OpenIdDictServer

이해 등의 등록 및 인증의 흐름은 다음과 같습니다 :

  1. 모바일 앱 않는 트위터 숫자 또는 풍부한 인증 구글 (이것은 사용자가 대신 풍부한 인증을 할 수있는 더 나은 사용자 경험의 로그인 웹 브라우저 탭 열기). Twitter Digits/Google 로그인은 신원 토큰을 반환합니다.

  2. 모바일 앱은 AuthServer to SignIn을 호출하고 신원 토큰을 제공합니다.

  3. Identity Server는 Digits 서비스 또는 Google Auth Service를 사용하여 제시된 ID 토큰의 유효성을 검사합니다.

  4. 일단 확인되면 AuthServer는 사용자를 찾으려고 시도하고 사용자가없는 경우 사용자를 찾습니다.

  5. AuthServer가 모바일 앱에 액세스 토큰을 반환합니다.

이제 # 3-4 단계를 구현할 옵션을 찾고 있습니다.

현재 내가 수행 한 작업은 사용자 이름을 전화 번호 또는 전자 메일 주소 및 암호를 Google/Twitter Digits ID 토큰으로 보낸 토큰 끝점 코드를 수정하는 것입니다. 이제 인증 서버는 전송 된 비밀번호가 제 3 자 서비스를 통해 확인해야하는 토큰임을 알아야하므로 TokenHint에 서비스 이름 "Digits"또는 "Google"을 전송하여 해결했습니다.

아주 잘 작동하지만, 내가 달성하려고하는 것을 지원하는 가장 깨끗한 방법이 무엇인지 궁금합니다.

답변

5

아주 잘 작동하지만, 내가 달성하고자하는 것을 지원하는 가장 깨끗한 방법이 무엇인지 궁금합니다.

개인적으로 사용자 정의 보조금 형태로 갈 것

:

// Register the OpenIddict services. 
services.AddOpenIddict() 
    // Register the Entity Framework stores. 
    .AddEntityFrameworkCoreStores<ApplicationDbContext>() 

    // Register the ASP.NET Core MVC binder used by OpenIddict. 
    // Note: if you don't call this method, you won't be able to 
    // bind OpenIdConnectRequest or OpenIdConnectResponse parameters. 
    .AddMvcBinders() 

    // Enable the token endpoint. 
    .EnableTokenEndpoint("/connect/token") 

    // Enable the refresh token flow and a custom grant type. 
    .AllowRefreshTokenFlow() 
    .AllowCustomFlow("urn:ietf:params:oauth:grant-type:google_identity_token") 

    // During development, you can disable the HTTPS requirement. 
    .DisableHttpsRequirement(); 

토큰을 보낼 때 : 당신은 또한 OpenIddict 옵션에서 활성화해야합니다

[HttpPost("~/connect/token")] 
[Produces("application/json")] 
public IActionResult Exchange(OpenIdConnectRequest request) 
{ 
    if (request.GrantType == "urn:ietf:params:oauth:grant-type:google_identity_token") 
    { 
     // Reject the request if the "assertion" parameter is missing. 
     if (string.IsNullOrEmpty(request.Assertion)) 
     { 
      return BadRequest(new OpenIdConnectResponse 
      { 
       Error = OpenIdConnectConstants.Errors.InvalidRequest, 
       ErrorDescription = "The mandatory 'assertion' parameter was missing." 
      }); 
     } 

     // Create a new ClaimsIdentity containing the claims that 
     // will be used to create an id_token and/or an access token. 
     var identity = new ClaimsIdentity(OpenIdConnectServerDefaults.AuthenticationScheme); 

     // Manually validate the identity token issued by Google, 
     // including the issuer, the signature and the audience. 
     // Then, copy the claims you need to the "identity" instance. 

     // Create a new authentication ticket holding the user identity. 
     var ticket = new AuthenticationTicket(
      new ClaimsPrincipal(identity), 
      new AuthenticationProperties(), 
      OpenIdConnectServerDefaults.AuthenticationScheme); 

     ticket.SetScopes(
      OpenIdConnectConstants.Scopes.OpenId, 
      OpenIdConnectConstants.Scopes.OfflineAccess); 

     return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme); 
    } 

    return BadRequest(new OpenIdConnectResponse 
    { 
     Error = OpenIdConnectConstants.Errors.UnsupportedGrantType, 
     ErrorDescription = "The specified grant type is not supported." 
    }); 
} 

주 요청을 할 때는 오른쪽 grant_type을 사용하고 id_token을 assertion 매개 변수로 보내면 제대로 작동합니다.

여기에 페이스 북의 액세스 토큰을 사용하는 예제입니다 :이 단계는 특히 오류가 발생하기 쉬운대로, 토큰 검증 루틴을 구현할 때

특히 조심하십시오. 잠재 고객 (그렇지 않은 경우 your server would be vulnerable to confused deputy attacks)을 포함하여 모든 것을 검증하는 것이 중요합니다.

+0

이것은 완벽합니다. 고마워. –