私は、OpenIDictを使用して/ connect/tokenのエンドポイントで.NET CORE APIプロジェクトである1つのプロジェクト(プロジェクトA)を所有し、JWTトークンを発行して、このプロジェクトは素晴らしい作品です。.NET CORE API OpenIDict/Identityを使用してFacebookログインを行う
私は別のプロジェクト(プロジェクトB)を持っています。これは非常に単純なプロジェクトで、APIにアクセストークンを取得してAPIからデータを取得するようにHTMLに要求しています。このプロジェクトは素晴らしい作品です。
ここで私の頭脳を包み込むことができない部分は、どうやってこの2つの全く別々のプロジェクト間でFacebookのログインを使用しますか?私はすべてが1屋根の下にあるなら、それを使用する方法を知っています、そして、それは本当に簡単ですが、このシナリオは、すべてが分かれているので、私は完全に混乱しています。ですから、ExternalLogin、ExternalLoginCallBackロジック(個々のアカウントを使用して.NET Webテンプレートから)、APIを処理する初心者にとっては、 HTMLプロジェクトですか? Facebookに接続するときに、どのURLをリダイレクトする必要がありますか(API/HTMLプロジェクト)?その後、誰が 'Startup.cs'ファイルに以下のコードを入れるべきですか?
STARTUP.CS(API)
ます。public void ConfigureServices機能::(API)
// add entity framework using the config connection string
services.AddEntityFrameworkSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
// add identity
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// add OpenIddict
services.AddOpenIddict<ApplicationUser, ApplicationRole, ApplicationDbContext>()
.DisableHttpsRequirement()
.EnableTokenEndpoint("/connect/token")
.AllowPasswordFlow()
.AllowRefreshTokenFlow()
.UseJsonWebTokens()
.AddEphemeralSigningKey();
services.AddCors();
app.UseFacebookAuthentication(new FacebookOptions
{
AppId = "xxxxxxx",
AppSecret = "xxxxxxxxx",
Scope = { "email", "user_friends" },
Fields = { "name", "email" },
SaveTokens = true,
});
そして最後に、これはここに役立ちます場合は、私がプロジェクトA現在設定している方法です
public void Configure関数:(API)
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
RequireHttpsMetadata = false,
Audience = "http://localhost:54418/",
Authority = "http://localhost:54418/"
});
認証コントローラ(API)
public class AuthorizationController : Controller
{
private OpenIddictUserManager<ApplicationUser> _userManager;
public AuthorizationController(OpenIddictUserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
[HttpPost("~/connect/token")]
[Produces("application/json")]
public async Task<IActionResult> Exchange()
{
var request = HttpContext.GetOpenIdConnectRequest();
if (request.IsPasswordGrantType())
{
var user = await _userManager.FindByNameAsync(request.Username);
if (user == null)
{
return BadRequest(new OpenIdConnectResponse
{
ErrorDescription = "The username or password provided is incorrect"
});
}
var identity = await _userManager.CreateIdentityAsync(user, request.GetScopes());
// Add a custom claim that will be persisted
// in both the access and the identity tokens.
if (user.Avatar != null)
{
identity.AddClaim("user_avatar", user.Avatar,
OpenIdConnectConstants.Destinations.AccessToken,
OpenIdConnectConstants.Destinations.IdentityToken);
}
if (user.InSiteUserName != null)
{
identity.AddClaim("insite_username", user.InSiteUserName,
OpenIdConnectConstants.Destinations.AccessToken,
OpenIdConnectConstants.Destinations.IdentityToken);
}
identity.AddClaim("hasLoggedIn", user.HasLoggedIn.ToString(),
OpenIdConnectConstants.Destinations.AccessToken,
OpenIdConnectConstants.Destinations.IdentityToken);
// Create a new authentication ticket holding the user identity.
var ticket = new AuthenticationTicket(
new ClaimsPrincipal(identity),
new AuthenticationProperties(),
OpenIdConnectServerDefaults.AuthenticationScheme);
ticket.SetResources(request.GetResources());
ticket.SetScopes(request.GetScopes());
return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);
}
return BadRequest(new OpenIdConnectResponse
{
Error = OpenIdConnectConstants.Errors.UnsupportedGrantType,
ErrorDescription = "The specified grant type is not supported."
});
}
}
}
それは裸/かなり基本的だとすべてのためのAPIに依存しているので、それがプロジェクトBから何かを含めていた場合、私は知りません。
私はこれが読み込まれ複雑な質問であることを知っています。私はそれをできるだけ流動的に提示していないと確信していますので、私は前に言ったように、前もって謝ります。ありがとうございました!
私はOpenIdDictを個人的に使っていませんが、理論的には最終的なアイデンティティを発行しているプロジェクトであるため、Apiプロジェクトでfacebook authを設定する必要があります。 HTMLプロジェクトはアイデンティティを消費するだけです。 OpenIdDictには、外部のアイデンティティプロバイダを含めるための何らかの方法が必要です。アイデンティティサーバはトークンサーバでもあります。私は、これがいくらか動作するなら、トークンサービスがプロバイダ名を必要とすると推測しています。 –
[examples](https://github.com/openiddict/openiddict-samples)をご覧ください。あなたはこのライブラリの作成者から助けを得ることができるようにタグを編集しました – tmg
@tmgタグを更新してくれてありがとう! – Pinpoint