[英]Best way to use Microsoft.Graph SDK when I already have users' refresh tokens stored in database?
我正在構建一個多用戶、多租戶應用程序,它將在離線時代表許多用戶訪問 Microsoft Graph API。
因為該應用程序使用 Microsoft Identity 進行外部 OIDC 身份驗證,所以在用戶首次登錄期間,我已經請求了適當的范圍/同意,並收到了 Microsoft 頒發的訪問/刷新令牌。 令牌保存在數據庫中。
現在我想使用Microsoft.Graph
這使得訪問 Graph API 變得更加容易,但似乎這個 SDK 的很大一部分是為了檢索令牌而編寫的,我不需要它,因為我已經有了令牌。
但是,我確實希望 SDK 客戶端自動使用存儲的刷新令牌來獲取新的訪問令牌,而不必自己手動處理刷新邏輯,如果可能的話。
經過研究,我發現我可以在構造GraphServiceClient
時為AuthenticationProvider
傳入一個null
,然后手動將承載令牌附加到客戶端,如下所示:
var graphClient = new GraphServiceClient(authenticationProvider: null);
var requestHeaders = new List<HeaderOption>()
{ new HeaderOption("Authorization", "Bearer " + myToken) };
var me = await graphClient.Me.Request(requestHeaders).GetAsync();
這確實有效並繞過了客戶端的令牌檢索邏輯,但現在的問題是它不會處理訪問令牌到期/更新。 因此,我必須使用單獨的代碼來確保始終傳遞未過期的訪問令牌,並在必要時使用刷新令牌自己更新令牌。
我想知道是否有一種方法可以自定義GraphServiceClient
,這樣它就不會嘗試使用單獨的 OAuth2/OIDC 流來獲取令牌,而是知道如何找到存儲在我的數據庫中的現有刷新令牌,並使用該刷新令牌來管理它更新/到期邏輯,就像它通過常規流程接收的令牌一樣。
理想的流程是這樣的:
傳入一個參數(我的數據庫中的用戶 ID)來創建一個GraphServiceClient
。
客戶端使用此用戶 ID 在我的數據庫 (EF Core) 中查找存儲的令牌。
如果存儲的訪問令牌已過期,請使用存儲的刷新令牌獲取新令牌,並更新數據庫中的令牌。
SDK 可以做到這一點嗎?
您的建議將不勝感激。
您可以在自己的自定義 class 中實現IAuthenticationProvider
接口,然后在AuthenticateRequestAsync
function 中進行必要的令牌檢查/刷新。 有關示例,請參閱https://github.com/microsoftgraph/msgraph-training-dotnet-core/blob/main/demo/GraphTutorial/Authentication/DeviceCodeAuthProvider.cs 。
我建議查看MSAL 庫來為您處理所有令牌邏輯。 您可以掛鈎到它的令牌緩存以按照您的意願對其進行序列化(例如,將其存儲在數據庫中)。 在我鏈接的示例中,我使用的是 MSAL,您可以看到我不必對過期令牌進行任何檢查,這一切都已為我處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.