2017-05-07 301 views
13

現在,我試圖在我的ASP.net核心Web API項目中使用Google和Facebook進行OAuth身份驗證。ASP.net核心Web API:使用Facebook/Google OAuth訪問令牌進行身份驗證

我目前的狀態是:

  • 我已經在用戶需要的ASP.net核心Web API項目進行認證
  • 我應該用我的網角2的Web應用程序API(身份驗證)
  • 我有一個Android應用程序,它應該用我的網絡API(身份驗證)

我的目標是:

  • 使用谷歌/ Facebook的OAuth的提供商進行登錄
  • 後:將自己的用戶帳戶(可能與IdentityServer4)
  • 沒有必要重定向到一個特殊的登錄網站(如IdentityServer4解)。只需點擊應用中的臉書/谷歌按鈕,即可訪問,完成!

在我的android和角度的應用程序,我能夠從谷歌/臉書檢索訪問令牌。現在,我想使用OAuth隱式流程來驗證用戶在我的web api上的給定訪問令牌(將令牌放入標頭中作爲不記名令牌)

有我的問題:是否有任何genric方式輕鬆做到這一點?我不希望爲此使用Facebook /谷歌SDK。

我曾嘗試以下操作:

  • 使用IdentityServer4:有了這個我能夠與Facebook登錄/谷歌在我的WebAPI,但需要重定向到IdentityServer4登錄頁面。是否有任何可能的方法,只是在我的應用程序中打入google/fb-Button並登錄,而不重定向到identityServer登錄頁面?
  • 使用谷歌/臉書認證中間件https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/):但他們沒有驗證我發送的持票人令牌(試過無數的方式來實現適當的驗證)。這甚至有可能在web api中使用嗎?
  • 嘗試使用Microsoft.AspNetCore.Authentication.JwtBearer的中間件,並通過自己投入了谷歌/ Facebook的必要的選項,也沒有驗證(藏漢無數次)

在過去的幾天裏,我嘗試了很多可能的解決方案,以至於我完全陷入困境,失去了爲實現這一目標需要做的事情。在這一點上,我已經閱讀了幾乎每個asp.net web api oauth tutorial/stackoverflow條目,但無法弄清楚如何在我的情況下使用它,因爲我想要的。大多數教程僅適用於mvc網站或使用IdentityServer4重定向到其登錄頁面。

任何建議或解決方案?我錯過了什麼?

+1

對於第三方認證,我相信當頁面重定向回你的應用程序(用戶進行身份驗證),HTTP請求應包含認證數據。你可以編寫一個全局過濾器來攔截它。在這裏查看一些細節:https://andrewlock.net/an-introduction-to-oauth-2-using-facebook-in-asp-net-core/ – wannadream

+0

你有沒有解決這個問題? – Marcus

+1

我發現了一個解決方案(幾個星期前,忘記在這裏更新): 在IdentityServer4的身份驗證端點上,可以使用特殊參數立即重定向到所選身份提供商的網站,而無需通過身份服務器的登錄頁面。如此處所述http://docs.identityserver.io/en/release/endpoints/authorize.html acr_values中的idp:name_of_idp參數會直接重定向到身份提供程序,這正是我想要的。 – Rul3r

回答

10

如果我正確地沉沒了,您已經通過您的應用程序從Facebook SDK獲得了Facebook用戶令牌。
像你一樣,我無法找到如何使用ASP.NET核心庫/軟件包。所以我回到基礎。
我只是用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)); 
} 
相關問題