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クラスの「コピー貼り付け」コードに基づいています。
それはいくつかの追加のハックで作業している一般的にが、私は車輪の再発明という強い気持ちを持っている...それはいくつかの追加のハックと協力して、一般的に
"ログインエンドポイントにユーザーをリダイレクトします"しかし、モバイルクライアントを持っていて、ブラウザを開きたくない場合はどうすればよいですか?モバイルクライアントでは、埋め込まれたソーシャルログインフォームがあり、Google/facebookなどのログインに成功した場合にアクセストークンを返します。そして、自分のトークンと交換するだけです。 – Set
'私はそれを自分のトークンと交換したいだけです.'> OpenIddictではこれをサポートする方法はありません。標準ではありません。 IETFは現在、新しいドラフト(https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-05)に取り組んでいますが、OpenIddictと外部プロバイダ(ここではGoogle )それを実装する。 – Pinpoint
ok ...私は、ドラフトへのリンクに感謝しています – Set