Как я могу реализовать поток Dropbox OAuth2 PKCE с помощью Blazor Webassembly?

#oauth-2.0 #dropbox-api #session-storage #blazor-webassembly #pkce

#oauth-2.0 #dropbox-api #сеансовое хранилище #blazor-webassembly #pkce

Вопрос:

Я пытаюсь использовать Dropbox.Api dotnet SDK, который построен на netstandard 2.0, путем перевода примера из документации здесь в проект Blazor Webassembly. Я сузил проблему до того факта, что PKCEOAuthFlow класс использует закрытые члены CodeVerifier и CodeChallenge для реализации потока PKCE, и эти закрытые члены генерируются и устанавливаются только в конструкторе, что имеет смысл.

Итак, именно здесь я застрял: как я могу сохранить этот точный объект с его одноразовым сгенерированным CodeVerifier/CodeChallenge , который должен быть таким же, когда я пытаюсь вызвать ProcessCodeFlowAsync после перенаправления Dropbox обратно в мое приложение?

Я попробовал следующее:

  1. Открываем URL авторизации dropbox на новой вкладке, чтобы основная вкладка оставалась открытой. Это не удается, потому что, когда Dropbox перенаправляет пользователя обратно, он остается на новой вкладке, а мой объект все еще активен только на первой вкладке.
  2. Создаю ILoginService класс, добавляю его на свои страницы как одноэлементный, выполняя builder.Services.AddSingleton<ILoginService, DropboxLoginService>(); внутри Program.cs , но я всегда получаю новый. Я не совсем уверен, почему это не удается, но я считаю, что все приложение Webassembly выходит за рамки, когда я отправляю пользователя в Dropbox, и после перенаправления оно в любом случае должно создать новое ILoginService .
  3. Я также попытался создать весь DropboxLoginService свой класс static со статическим PKCEOAuthFlow элементом, установленным в статическом конструкторе. Я также получаю новый объект каждый раз, когда делаю это таким образом, вероятно, по той же причине, что и # 2.
  4. Я попытался сохранить свой объект в хранилище сеансов браузера, используя Blazored.SessionStorage , но я быстро понял, что при этом не сохраняются какие-либо закрытые элементы, и объект, который я извлекаю после перенаправления, снова имеет новый CodeVerifier и CodeChallenge .
  5. Я ЕЩЕ НЕ ПРОБОВАЛ ЭТО — я думаю, что, ВОЗМОЖНО, я мог бы сериализовать весь объект в некотором двоичном формате, а затем сохранить строку base64 в хранилище сеанса, чтобы получить ее позже. Однако это похоже на дыру в безопасности, учитывая, что весь смысл PKCE заключается в том, чтобы избежать ненадежного хранилища с конфиденциальной информацией. Это в основном сведет на нет безопасность, поскольку бесстрашный хакер может каким-то образом добраться до этого объекта и MITM моего пользователя. По сути, это не более безопасно, чем возврат к обычному OAuth2 с сохраненным где-то секретом моего приложения.

Я делаю это слишком сложным? Есть ли какой-нибудь способ сохранить мой PKCEOAuthFlow объект в памяти от начала до конца моего потока, через 2 перенаправления из моего приложения -> Dropbox -> обратно в мое приложение? Я думаю, что этот вопрос выходит за рамки Dropbox и применим к любой реализации потока OAuth2 PKCE в Blazor Webassembly или к любому бессерверному SPA или PWA.