我正在尝试创建一个Web API,允许API的客户端(本地移动应用程序)使用第三方云存储提供程序进行登录。我正在使用来自Microsoft的以下常规流程:
这是我想要实现的目标:
我正在使用带有外部身份验证的默认ASP.NET Web API Visual Studio模板,以及OWin.Security.Providers Nuget包实现Dropbox登录功能,并使用现有的内置登录功能实现Google(Drive)和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并将授权代码返回到Web API,而Web API将把授权代码发送回第三方以获取令牌,然后将其返回给客户端,就像上面的图表所示。我需要在AccountController中的ExternalLogin操作中以某种方式检索Dropbox URL并将其返回到客户端(它只是一个JSON响应),但我看不到检索它的方法(它只返回ChallengeResult,实际的Dropbox URL被埋藏在某个地方)。此外,我认为我需要一种根据授权代码单独请求第三方令牌的方法。
这篇帖子似乎与我正在尝试做的事情有些相似:
使用OWIN身份验证注册来自多个API客户端的Web API 2外部登录
...但那里的解决方案似乎需要客户端是MVC应用程序,这不一定适用于我。我想在客户端上尽可能简单,按照我上面的图表流程进行操作,但同时也不要重新发明轮子(尽可能重用OWIN/OAuth2实现中已经存在的内容)。理想情况下,我不希望客户端必须引用任何OWIN/OAuth库,因为我真正需要客户端做的只是访问API提供的外部URL(在我的示例中为Dropbox),允许用户输入其凭据并授予权限,并将结果授权代码发送回API。
从概念上来说,这听起来并不困难,但我不知道如何实现它并仍然尽可能多地使用现有的OAuth代码。请帮忙!