サーバーの日のために、私はOAuth GoogleおよびFacebookでの認証を取得して、ASP.netコアWeb APIプロジェクト内で動作するようにしています。
私の現在のステータスは:
私の目標は:
私のAndroidおよびangularアプリでは、google/facebookからアクセストークンを取得できます。ここで、OAuth暗黙的なフロー、指定されたアクセストークンを使用して私のWeb APIでユーザーを認証する(トークンをベアラートークンとしてヘッダーに入れる)
私の問題があります:これを簡単に行う一般的な方法はありますか?これにはfacebook/google SDKを使用したくありません。
私は以下を試しました:
過去数日間、私は非常に多くの可能な解決策を試しましたが、これを達成するために何をする必要があるのか完全に行き詰まってしまいました。この時点で、私はほぼすべてのasp.net web api oauth tutorial/stackoverflowエントリを読みましたが、私のケースでこれをどのように使用するかを理解できません。ほとんどのチュートリアルはmvc専用です-Webサイト、またはIdentityServer4とそのログインページへのリダイレクト。
提案や解決策はありますか?何が欠けていますか?
私が正しく理解した場合、あなたはすでにあなたのアプリを通じて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));
}