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