2016-07-15 11 views
1

OpenIddictを使用して、ユーザー名/パスワードに基づいてモバイルクライアント用のアクセストークンを生成するOpenID Connectサーバーを実装しました。 次の目標は、サードパーティトークン(例:ソーシャルログイン)を使用してアクセストークンを生成する機能を提供することでした。私はGoogleトークンとの統合から始めましたが、これについてのサンプル/情報は見つけられませんでした。OpenID Connectサーバー。

私は現在、エンドポイント「/ /トークンを接続」であり、例えば、「コード」パラメータで、Googleのトークンを送信するために要求を行うことである持っている唯一の1つのアイデアを「グーグル:」形式、そしてOpenIdConnectServerProvider.DeserializeAuthorizationCodeメソッドをオーバーライドします。

認証コードを受け取ったときに呼び出されます。アプリケーションでは、カスタム・フォーマットを使用してコードをデシリアライズするために、このコンテキストを使用することができますし、OpenIddictProviderに基づいて

だから私が作成した独自のCustomProviderクラスを使用して、デフォルトのロジックをスキップし、

services.AddOpenIddict<ApplicationUser, ApplicationRole, ApplicationDbContext, int>() 
    .Configure(builder => 
    { builder.Provider = new CustomProvider(sp.GetRequiredService<SignInService>()); } 

それを登録し、上書きDeserializeAuthorizationCode方法:GoogleTokenValidatorハンドリングGoogleのトークンのカスタムクラスである

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); 
    } 
} 

(それはGoogleユーザーへの呼び出しを行いますインフォメーションエンドポイントを生成し、ClaimsPrincipalを生成する)、aspnet/Security repoのGoogleHandlerクラスの「コピー貼り付け」コードに基づいています。

それはいくつかの追加のハックで作業している一般的に

が、私は車輪の再発明という強い気持ちを持っている...それはいくつかの追加のハックと協力して、一般的に

答えて

1

、私は改革という強い気持ちを持っていますホイール...

あなたはホイールを再発明するだけでなく、OpenIddictによってサポートされていない完全に非標準的なものも実装しています。

ここで私は(我々はMVCサーバーのサンプルに使用するものである)をお勧めしますアプローチです:

  • のOAuth2/OpenIDの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

関連する問題