【问题标题】:Javascript App with OAuth2 Authorization Code Flow?具有 OAuth2 授权代码流的 Javascript 应用程序?
【发布时间】:2016-03-09 22:45:21
【问题描述】:

在这种情况下你可以实现“授权码流程”吗?

www.app.com

中的单页应用

www.backend.com

中的 REST 后端

是否可以通过javascript获取“授权码”,然后将其传递给“后端”以获得“访问令牌”?

【问题讨论】:

    标签: oauth-2.0 openid-connect


    【解决方案1】:

    理论上,在 JS/移动/桌面应用程序中使用授权代码流(或混合流)绝对是可能的,您甚至不需要为此存储客户端凭据(当然可以,但是提取它们是如此容易,以至于毫无意义)。

    与普遍看法相反,在使用授权代码流时,“公共”应用程序(即无法安全存储其凭据的应用程序,包括 JS 应用程序)不需要客户端身份验证:

    如果客户类型是保密的或客户是发给客户的 凭据(或分配的其他身份验证要求), 客户端必须按照所述向授权服务器进行身份验证 在第 3.2.1 节中。

    https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3

    如果客户端是机密客户端,则它必须使用为其 client_id 注册的身份验证方法向令牌端点进行身份验证,如第 9 节所述。

    http://openid.net/specs/openid-connect-core-1_0.html#TokenRequest

    在实践中,我很确定大多数授权/身份验证服务器在使用授权代码流时会强制执行客户端身份验证,而是建议对公共应用程序使用隐式流。

    如果您的授权服务器支持这种情况,如果您使用response_mode=query(或更好:@Hans 建议的response_mode=fragment),在您的 JS 应用程序中使用授权代码流应该很容易,因为您可以使用您的 JS main页面为redirect_uri,并使用一些JS从查询字符串或片段中提取授权码。

    【讨论】:

      【解决方案2】:

      这可以通过将redirect_uri 设置为您的SPA 中的某个位置,从授权响应中获取code(使用How to get the value from the GET parameters? 中描述的任何方法)并将其传递到特定于应用程序的后端方法。使用 OpenID Connect 时,可以选择在 redirect_uri 的片段中传递 code,这比将其作为查询参数传递具有一些安全优势。

      【讨论】:

      • 汉斯,那个解决方案不安全?为什么大家提到的唯一方式就是“隐式流”?谢谢:)
      • 您知道一个解释如何将“服务器流”用于 SPA 的博客吗?
      • 将令牌传递到 Javascript SPA 本质上不如将其传递到后端安全,因为不涉及客户端机密;如果您有可以使用的服务器代码(这使您的 SPA 不再是 SPA),请应用常规授权代码授权
      猜你喜欢
      • 2021-09-27
      • 2020-10-15
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      相关资源
      最近更新 更多