Я пытаюсь создать веб-API, который позволяет клиентам API (родным мобильным приложениям) войти в систему с использованием стороннего поставщика облачных хранилищ. Я использую следующий общий поток от Microsoft:
Вот чего я пытаюсь достичь:
Я использую стандартный шаблон ASP.NET Web API Visual Studio с внешней аутентификацией, а также OWin.Security.Providers Пакет Nuget для Dropbox функции входа в систему и существующие встроенные функции входа для Google (Диск) и Microsoft (OneDrive).
Проблема, с которой я сталкиваюсь, заключается в том, что встроенная функциональность, похоже, выполняет аутентификацию и авторизацию как часть одного потока. Например, если я установил следующее в Startup.Auth.cs:
DropboxAuthenticationOptions dropboxAuthOptions = new DropboxAuthenticationOptions
{
AppKey = _dropboxAppKey,
AppSecret = _dropboxAppSecret
};
app.UseDropboxAuthentication(dropboxAuthOptions);
... и перейдите к этому URL из моего веб-браузера:
http://<api_base_url>/api/Account/ExternalLogin?provider=Dropbox&response_type=token&client_id=self&redirect_uri=<api_base_url>
Я успешно перенаправлен на Dropbox для входа в систему:
https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=<id>&redirect_uri=<redirect_uri>
... а затем, после предоставления доступа, перенаправляется обратно на:
http://<api_base_url>/Help#access_token=<access_token>&token_type=bearer&expires_in=1209600
... поскольку вы можете видеть, что токен является частью этого, поэтому его можно извлечь. Проблема заключается в том, что клиент должен быть одним из тех, кто перемещается в Dropbox и возвращает код авторизации обратно в веб-API, и веб-API отправит код авторизации обратно третьему лицу, чтобы получить токен, который затем будет возвращен клиент... как показано на диаграмме выше. Мне нужно действие ExternalLogin в AccountController, чтобы каким-то образом получить URL-адрес Dropbox и вернуть его клиенту (это будет просто ответ json), но я не вижу способа получить это (он просто возвращает ChallengeResult, а фактический код Dropbox где-то похоронен). Кроме того, я думаю, мне нужен способ отдельно запросить токен у третьей стороны на основе кода авторизации.
Этот пост кажется немного похожим на то, что я пытаюсь сделать:
Регистрация внешних интерфейсов Web API 2 от нескольких клиентов API с идентификатором OWIN
... но решение, похоже, требует, чтобы клиент был MVC-приложением, что не обязательно для меня. Я хочу, чтобы это было максимально просто на стороне клиента, следуйте потоку с моей диаграммы выше, но также не изобретайте колесо (как можно больше используйте то, что уже существует в реализации OWIN/OAuth2). В идеале я не хочу, чтобы клиент должен был ссылаться на любую из OWIN/OAuth-библиотек, поскольку все, что мне действительно нужно, это доступ к внешнему url, предоставленному API (Dropbox в моем примере), пользователь вводит свои учетные данные и дать разрешение, и отправить полученный код авторизации обратно на api.
Концептуально это звучит не так сложно, но я не знаю, как его реализовать и по-прежнему использовать как можно больше существующего кода OAuth. Пожалуйста, помогите!