web-dev-qa-db-ja.com

ASP.netコアWeb API:Facebook / Googleを使用OAuth認証にアクセストークン

サーバーの日のために、私はOAuth GoogleおよびFacebookでの認証を取得して、ASP.netコアWeb APIプロジェクト内で動作するようにしています。

私の現在のステータスは:

  • ユーザーを認証する必要があるASP.netコアWeb APIプロジェクトがあります
  • 私はangular 2 Webアプリケーションを持っていますが、私のWeb APIを使用する必要があります(認証付き))
  • Androidアプリがあります。これは私のWeb APIを使用する必要があります(認証付き))

私の目標は:

  • OAuthログイン用のプロバイダーとしてGoogle/Facebookを使用する
  • 後で:独自のユーザーアカウントを追加する(おそらくIdentityServer4を使用)
  • 特別なログインWebサイト(IdentityServer4ソリューションなど)にリダイレクトする必要はありません。アプリのfacebook/googleボタンを押すだけで、アクセスを許可して完了です!

私のAndroidおよびangularアプリでは、google/facebookからアクセストークンを取得できます。ここで、OAuth暗黙的なフロー、指定されたアクセストークンを使用して私のWeb APIでユーザーを認証する(トークンをベアラートークンとしてヘッダーに入れる)

私の問題があります:これを簡単に行う一般的な方法はありますか?これにはfacebook/google SDKを使用したくありません。

私は以下を試しました:

  • IdentityServer4を使用して:これにより、webapiでfacebook/googleを使用してログインできますが、IdentityServer4ログインページにリダイレクトする必要があります。私のアプリでgoogle/fb-Buttonを押してログインするだけの可能な方法はありますかidentityServerログインページにリダイレクトせずに
  • google/facebook認証ミドルウェアの使用https://docs.Microsoft.com/en-us/aspnet/core/security/ authentication/social / ):しかし、送信されたベアラートークンを検証していません(適切な検証を実現するために無数の方法を試しました)。これはWeb API内でも使用できますか?
  • Microsoft.AspNetCore.Authentication.JwtBearer-Middlewareを使用しようとし、google/facebookに必要なオプションを自分で入力しますが、検証もしません(無数の試み)

過去数日間、私は非常に多くの可能な解決策を試しましたが、これを達成するために何をする必要があるのか​​完全に行き詰まってしまいました。この時点で、私はほぼすべてのasp.net web api oauth tutorial/stackoverflowエントリを読みましたが、私のケースでこれをどのように使用するかを理解できません。ほとんどのチュートリアルはmvc専用です-Webサイト、またはIdentityServer4とそのログインページへのリダイレクト。

提案や解決策はありますか?何が欠けていますか?

18
Rul3r

私が正しく理解した場合、あなたはすでにあなたのアプリを通じてFacebook SDKからあなたのFacebookユーザートークンを持っています。
ASP.NET Coreライブラリ/パッケージでそれを行う方法を見つけることができなかったように。だから私は基本に戻りました。
Facebookトークンを使用してAPIのエンドポイントを呼び出し、FacebookグラフAPIと照合し、問題がなければユーザーを登録し(必要な場合)、ユーザーが従来の方法でログインしたかのようにJWTトークンを返しますユーザー名/パスワードのパス。

[HttpPost]
[AllowAnonymous]
[Route("api/authentication/FacebookLogin")]
public async Task<IActionResult> FacebookLogin([FromBody] FacebookToken facebookToken)
{
    //check token
    var httpClient = new HttpClient { BaseAddress = new Uri("https://graph.facebook.com/v2.9/") };
    var response = await httpClient.GetAsync($"me?access_token={facebookToken.Token}&fields=id,name,email,first_name,last_name,age_range,birthday,gender,locale,picture");
    if (!response.IsSuccessStatusCode) return BadRequest();
    var result = await response.Content.ReadAsStringAsync();
    var facebookAccount = JsonConvert.DeserializeObject<FacebookAccount>(result);

    //register if required
    var facebookUser = _context.FacebookUsers.SingleOrDefault(x => x.Id == facebookAccount.Id);
    if (facebookUser == null)
    {
        var user = new ApplicationUser {UserName = facebookAccount.Name, Email = facebookAccount.Email};
        var result2 = await _userManager.CreateAsync(user);
        if (!result2.Succeeded) return BadRequest();
        facebookUser = new FacebookUser {Id = facebookAccount.Id, UserId = user.Id};
        _context.FacebookUsers.Add(facebookUser);
        _context.SaveChanges();
    }

    //send bearer token
    return Ok(GetToken(facebookUser.UserId));
}
15
François