ASP.NET CoreのFacebook認証
前回、外部ログインのセットアップまでは説明したので今回はFacebook認証の追加だけです。
よく個人でサイトを作っている人を見るとFacebookは実装されてないことをよく見るのですが、ここは詰まる人が多いと思います。
前準備
Facebook for Developersでアプリを作成します。これもだいたい以下のURLに書いてます。
docs.microsoft.com
ここも基本的には「/signin-facebook」でcallback Urlを設定してください。
アプリIDとapp secretを取得しておいてください。
Startupに登録
ConfigureServicesに以下を追加
services.AddAuthentication().AddFacebook(facebookOptions => { facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"]; facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"]; });
複数のSNSログインを実装している場合は以下のようにメソッドチェーンで実装出来ます。
services.AddAuthentication() .AddMicrosoftAccount(microsoftOptions => { ... }) .AddGoogle(googleOptions => { ... }) .AddTwitter(twitterOptions => { ... }) .AddFacebook(facebookOptions => { ... });
Viewを作成
// これか <a asp-action="SignIn" asp-route-provider ="Facebook">Facebook</a> // これでもおけ <a href="/auth/signin?provider=Facebook">Facebook</a>
これで前回のTwitterの記事と同じ要領で実装終了です。
本番だと動かない!
テストだと動くのですが、本番だと動きませんでした。要因はいくつかあると思うのですが、僕の場合はRedirectUrlがhttpで403になったことが原因でした。F12で調べてみてください。添付した画像はhttpsですが、403の場合httpになっている可能性があります。
「なんだよこれ」と思って自力でOAuthを実装しようかと思って気がつきました。
リクエストをhttpsにする
app.Use((context, next) => { context.Request.Scheme = "https"; return next(); });
これ以外にも以下の対処法があるみたいです。
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseHttpMethodOverride();
これはKestrelとリバプロが関係しているからXForwardedForで対処できるのかよくわかりません。よくわからなかったのでhttpsに変換する方法で対応しました(全部httpsでも困らないし)これがnginxだけなのかよくわかりません。
おそらくこれを対処しないとGoogleも出来ないですし、いつかTwitterもダメになっちゃうので気づいてよかったです。