代码之家  ›  专栏  ›  技术社区  ›  nowox

如何使用OAuth密码授予类型获取授权代码?

  •  0
  • nowox  · 技术社区  · 6 年前

    我想使用OAuth来授权用户(由 username 我是说, password )在内联网上,但我不太明白如何使用OAuth来满足我的需求。

    我主要关心的是防止 backend (客户端),收集用户的密码和前端,接收访问令牌。

    如果我使用 密码授予类型 ,只有 前端 无法收集用户凭据,但是没有重定向或 授权码 对于这个补助计划, 前端 也会得到 访问令牌 因此可以被偷。

    还有,用这个 密码授予类型 ,和 前端 必须同时提供 客户id 客户端密码 只有 后端 是的。

    如何使用oauth 密码授权 在这种情况下?

    用例

    我正在编写一个intranet平台,该平台应该接受来自ActiveDirectoryServer的用户最简单的解决方案是使用以下形式:

    <form method="post">
      <input type="text" name="username" required>
      <input type="password" name="password" required>
      <input type="submit" name="login">
    </form>
    

    因此 后端 可以使用活动目录服务器验证接收到的凭据但是,这是一个非常不安全的解决方案,因为 后端 可以收集用户的密码。在我编写应用程序时,这非常诱人:(

    因此,我想在我无法控制的情况下设置第三方OAuth服务器,以便使用此表单:

    <form action="http://oauth.company.com" method="post">
      <input type="hidden" name="redirect" value="http://intranet.company.com">
      <input type="hidden" name="grant_type" value="password">
      <input type="hidden" name="client_id" value="badbeef">
    
      <input type="text" name="username" required>
      <input type="password" name="password" required>
      <input type="submit" name="login">
    </form>
    

    有了这个解决方案,只有 前端 会看到密码,但由于任何用户都可以检查源代码,这会阻止我尝试获取他们的密码,因为我会暴露太多。

    非统组织 密码授权 我有两个问题:

    • 这个 前端 必须意识到 client_secret .
    • 这个 前端 将收到 访问令牌 .

    所以我想要两个解决方案:

    1. 这个 前端 得到一个 授权码 然后传送到 后端
    2. 这个 授权服务器 亲自通知 后端 访问令牌 是的。

    希望的身份验证流

    前端 ,和 资源所有者 输入发送到 授权服务器 ,因此 顾客 不知道 资源所有者 资格证书。

    POST /oauth/token HTTP/1.1
    Host: oauth.company.com
    
    grant_type=password
    &username=jdoe
    &password=secret
    &client_id=intranet-id
    &state=123
    &redirect=http://intranet.company.com/auth
    

    这个 授权服务器 授予用户并将其发送回 方端 以下内容:

    HTTP/1.1 302 Found
    Location: https://intranet.company.com/auth?code=g0ZGZmNjVmOWI&state=dkZmYxMzE2
    

    然后后端请求 访问令牌 收到 代码 以下内容:

    POST /oauth/token HTTP/1.1
    Host: oauth.company.com
    
    grant_type=????
    &code=g0ZGZmNjVmOWI&state=dkZmYxMzE2
    &client_id=intranet-id
    &client_secret=intranet-secret
    

    然后它收到:

    HTTP/1.1 200 OK
    Content-Type: application/json
    Cache-Control: no-store
    Pragma: no-cache
    
    {
      "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
      "token_type":"bearer",
      "expires_in":3600,
      "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
      "scope":"create"
    }
    

    从这一点来看, 后端 重定向 前端 到内部网门户。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Hans Z.    6 年前

    资源所有者密码凭据授予是一个不推荐使用的流,仅用于迁移目的当然,由于您列出的原因,它不能与javascript应用程序一起使用。在这种情况下,如果应用程序将(完整)浏览器重定向到标识提供程序,并且标识提供程序可以在不涉及您的客户端的情况下对用户进行身份验证,请使用隐式或授权代码授权。