簡體   English   中英

應該使用什么類型的第 3 方身份驗證 (OAuth) 來登錄用戶以擁有 API

[英]What type of 3rd party authentication(OAuth) should be used to sign in users to own API

我有一個 API,它使用 Microsoft Identity Platform 作為對用戶進行身份驗證的方式。

我需要重構它,因為我認為我在實現中犯了一些錯誤。

因此,重新開始,我想知道如何處理第 3 方驗證器的邏輯是什么。 話雖如此,如果有人可以確認以下身份驗證流程是否有意義,我將不勝感激。

似乎合理的序列是:身份驗證序列

  • 客戶端 APP(Web 瀏覽器、移動應用程序)向 microsoft login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize請求
  • 用戶輸入憑據后,Microsoft 使用?code參數重定向到客戶端應用程序
  • 客戶端應用程序將coderedirect_uri發送到我的 API
  • 我的 API 通過將code傳遞給令牌端點login.microsoftonline.com/{tenant}/oauth2/v2.0/token來獲取access_tokenrefresh_token
  • 我的 API 將令牌存儲在數據庫中。
  • 我的 API 生成一個 session hash 將該用戶 ID 映射到那些 access_tokens 和 refresh_tokens
  • 我的 API 通過 url 將該 session_hash 重定向到客戶端 APP。
  • 客戶端APP使用那個session hash消費我的API。

令牌驗證

在數據庫中存儲令牌時,存儲它們的到期日期。

  1. 對於對我的 API 所做的每個請求,檢查當前日期是否在到期之前。
  2. 如果不是,請使用refresh_token刷新令牌並將舊令牌替換為新令牌。
  3. 如果無法刷新令牌,則發送 401 錯誤並在客戶端 APP 上觸發新的 OAuth 身份驗證。 再次運行“身份驗證序列”。
  4. 允許請求繼續。

對不同客戶端平台的擔憂。

Microsoft 為不同的客戶端提供身份驗證庫 (MSAL)。 但是這些庫,據我了解,是對用戶進行身份驗證,將令牌存儲在本地,並使用 Microsft Graph API。這讓我質疑我的流程的可靠性,因為我制作它的方式不兼容有了這些庫。

我相信您不需要做所有這些並且可以使事情變得非常簡單。

您可以執行以下操作:

  • 您可以從客戶端應用程序對用戶進行身份驗證,一旦用戶通過身份驗證,您就可以為您的 API 獲取令牌。您可以為此使用 MSAL。 MSAL 將負責緩存令牌(包括訪問令牌和刷新令牌),並在需要時更新它們。
  • 當您的客戶端應用程序發出 API 調用時,您只需靜默地從 MSAL 請求令牌。 如果令牌獲取因任何原因失敗,MSAL 將引發錯誤,您將相應地在客戶端應用程序中處理該錯誤(例如,您可以重定向用戶以再次登錄)。
  • 一旦您的 API 收到訪問令牌,您就可以對其進行驗證。 前段時間我問了一個關於您可以在這里閱讀的相同內容的問題 - Azure AD - 為什么我不能為我的 Web API 驗證 Azure AD 頒發的 JWT 令牌? 收到“IDX10516:簽名驗證失敗”錯誤
  • 如果您的 API 需要代表登錄用戶訪問受保護的資源(例如 OneDrive),您可以使用隨請求一起發送的令牌在您的 API 中獲取該令牌。 例如,看看下面的代碼片段。 它獲得 Azure 資源管理器 API 的令牌。

假設您使用的是 .Net 5/Core,您需要先在 Startup.cs 中添加以下行:

services
    .AddMicrosoftIdentityWebApiAuthentication(Configuration, "ApiSettingsConfigurationSectionName")
    .EnableTokenAcquisitionToCallDownstreamApi()//This does the magic of getting the token for protected resources.
    .AddInMemoryTokenCaches();

那么這就是您如何在 API 控制器中獲取受保護資源的令牌:


private readonly ITokenAcquisition _tokenAcquisition;

...
...
...

public YourController(ITokenAcquisition tokenAcquisition,
    ...other injected parameters
    )
{
    _tokenAcquisition = tokenAcquisition;
    ...
}


/// <summary>
/// Gets the access token on behalf of signed-in user to perform Azure
/// Resource Manager (ARM) API.
/// </summary>
/// <returns>
/// Access token.
/// </returns>
private async Task<string> GetAccessTokenForAzureSubscriptionManagementApiRequest()
{
    string accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(['scopes for the protected API e.g. https://management.azure.com/user_impersonation']);
    return accessToken;
}

Microsoft 為不同的客戶端提供身份驗證庫 (MSAL)。 但是這些庫,據我了解,是對用戶進行身份驗證,將令牌存儲在本地,並使用 Microsft Graph API。

這不完全正確。 MSAL 可用於獲取受 Azure AD 保護的任何 API 的令牌。 圖 API 當然是其中之一,但您也可以對自己的 API 使用 MSAL,前提是它受到 Azure AD 的保護。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM