2

使用 OAUth2 Web 服务器流程,我已经:

  1. 用户尝试访问 www.third-party.com/welcome
  2. 用户被重定向到 www.myserver.com/oauth2/authorize
  3. MyServer 对用户进行身份验证,并将其重定向到 www.third-party.com/welcome?code=...
  4. third-party.com 在幕后与 myserver.com 对话,交换codeOAuth2 访问和刷新令牌。

都好。现在 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);
    }
}

我可以看到三种方法:

  1. www.myserver.com 上的(非 ReSTful)URI 端点,它将返回授权供应商不记名令牌的任何人的用户详细信息 - 因此第三方应用程序只需使用 OAuth2 不记名令牌点击 /userinfo 并取回用户的详细信息,包括用户名。

  2. 从访问令牌中检索用户身份 - 但我的理解是这需要解密密钥,它应该是客户端应用程序的一部分(?)

  3. 在第三方应用程序和 oauth2 授权服务器之间的令牌交换中包含一些额外的用户状态数据。

我猜(2)是个坏主意。(1)很容易实现,但我很想知道方法(3)是否可行以及我将如何去做。

4

1 回答 1

0

最常见的模式是用访问令牌交换用户详细信息,就像 Facebook 所做的那样:

“令牌”端点提供访问令牌

“我”端点提供与请求携带的访问令牌(承载令牌)相关的用户详细信息(根据授权范围)作为授权标头。

于 2013-09-03T12:40:47.083 回答