使用 OAUth2 Web 服务器流程,我已经:
- 用户尝试访问 www.third-party.com/welcome
- 用户被重定向到 www.myserver.com/oauth2/authorize
- MyServer 对用户进行身份验证,并将其重定向到 www.third-party.com/welcome?code=...
- third-party.com 在幕后与 myserver.com 对话,交换
code
OAuth2 访问和刷新令牌。
都好。现在 third-party.com 需要确定用户的规范用户名,因此它可以对 www.myserver.com/api/{username}/details 等资源进行 ReSTFUL URI 调用
我在 ASP.NET MVC 上使用 DotNetOpenAuth。我的 OAuth2 控制器如下所示:
namespace OurOAuth2.Server.Controllers { [Authorize] public class OAuth2Controller : Controller { private readonly AuthorizationServer authServer; 私有只读 IOAuth2ClientAuthorizationStore authStore;
private OAuth2AuthorizationServerHost authHost {
get {
return (((OAuth2AuthorizationServerHost)authServer.AuthorizationServerServices));
}
}
public OAuth2Controller(AuthorizationServer authServer, IOAuth2ClientAuthorizationStore authStore) {
this.authServer = authServer;
this.authStore = authStore;
}
[AllowAnonymous]
public ActionResult Token() {
var result = this.authServer.HandleTokenRequest(this.Request);
return (result.AsActionResult());
}
public ActionResult Secure() {
return (Content("This is secure!"));
}
public ActionResult Authorize() {
var request = this.authServer.ReadAuthorizationRequest(this.Request);
if (authHost.CanBeAutoApproved(request)) {
var approval = this.authServer.PrepareApproveAuthorizationRequest(request, HttpContext.User.Identity.Name);
authStore.StoreAuthorization(request.ClientIdentifier, User.Identity.Name, request.Scope);
// Any way, at THIS point, to include the canonical username in the
// token exchange?
var response = this.authServer.Channel.PrepareResponse(approval);
return response.AsActionResult();
}
// no scope authorization workflow yet.
return (null);
}
}
我可以看到三种方法:
www.myserver.com 上的(非 ReSTful)URI 端点,它将返回授权供应商不记名令牌的任何人的用户详细信息 - 因此第三方应用程序只需使用 OAuth2 不记名令牌点击 /userinfo 并取回用户的详细信息,包括用户名。
从访问令牌中检索用户身份 - 但我的理解是这需要解密密钥,它不应该是客户端应用程序的一部分(?)
在第三方应用程序和 oauth2 授权服务器之间的令牌交换中包含一些额外的用户状态数据。
我猜(2)是个坏主意。(1)很容易实现,但我很想知道方法(3)是否可行以及我将如何去做。