3

Googleのアプリでは、携帯電話番号またはGoogleでログインする必要があります。私たちは、モバイル番号認証のためにTwitter Digitsを計画しています。豊富なTwitterの数字/ OpenIdDictServerを使用したGoogle認証

私が理解としての登録と認証の流れは以下の通りです:

  1. モバイルアプリTwitterの数字やGoogleとの豊かな認証は(それが代わりの豊富な認証を行うために、ユーザにとってより良いユーザー体験だサインインありませんウェブブラウザタブを開く)。 Twitter Digits/Google Sign Inは、IDトークンを返します。

  2. モバイルアプリケーションはAuthServerをSignInに呼び出し、識別トークンを提示します。

  3. Identity Serverは、DigitsサービスまたはGoogle Authサービスを使用して、提示されたIDトークンを検証します。

  4. AuthServerが確認されると、ユーザーを見つけようとします。存在しない場合は、ユーザーを見つけようとします。

  5. AuthServerはモバイルアプリケーションにアクセストークンを返します。

ここで、手順#3-4を実装するオプションを探しています。

現在、ユーザー名を電話番号または電子メールアドレスとパスワードとしてGoogle/Twitter Digits IDトークンとして送信するトークンエンドポイントコードを変更することです。さて、認証サーバーは送信されたパスワードが実際にサードパーティのサービスで検証する必要のあるトークンであることを知る必要があるため、トークンヒントにサービス名 "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パラメータとして送信してください。正しく動作するはずです。

はここでFacebookのアクセストークンを使用した例です:このステップは、特にエラーが発生しやすいよう、トークンの検証ルーチンを実装する際に

非常に注意してください。オーディエンス(それ以外の場合はyour server would be vulnerable to confused deputy attacks)を含め、すべてを検証することは本当に重要です。

+0

これは完璧です!どうもありがとう。 –

関連する問題