【问题标题】:Authenticating with Oauth password flow from a front-end使用来自前端的 Oauth 密码流进行身份验证
【发布时间】:2016-02-09 10:23:45
【问题描述】:

我已经环顾了一段时间,似乎没有人能正确回答这个问题。

假设我有一个“不受信任”的客户端应用程序:一个 AngularJS 前端。 这个前端想要访问我的 api,所以用户必须首先以某种方式进行身份验证。

因此,如果我使用 oauth 密码流程,用户必须在 HTML 表单中填写他的凭据,并且 Angular 应用程序必须发送附加 client_id 和 client_secret 的请求。

我不明白的是,每个人和规范都说 client_secret 必须保密......

这很荒谬,您必须发送 client_secret 进行身份验证,但同时您必须让 Javascript 不知道它?

所以我的问题是:

如何在不泄露 client_secret 的情况下使用来自不受信任的客户端(Web 前端或移动应用)的 oauth 密码流?

是否有可能或根本不可能遵守此规范?

【问题讨论】:

    标签: javascript web-applications oauth-2.0


    【解决方案1】:

    您不应使用密码流程,而应使用不涉及 client_secret 的 implicit(又名 token)流程。

    此流程专为仅限客户端的应用程序设计,包括您描述的 JS 前端应用程序。

    除了您注意到的问题之外,使用来自客户端应用程序的密码流可能会遇到身份验证问题。例如,假设身份提供者使用双因素身份验证,或者可能将身份验证委托给另一个提供者。使用密码流程,这是您的应用程序要求输入用户名/密码的地方,实际上没有办法处理这个问题。另一方面,隐式流包括将流重定向到提供者,这取决于提供者使用任何可用的方式进行身份验证。

    您从隐式流中得到的是可以直接从客户端使用的令牌。

    【讨论】:

    • 对不起,但这并不能解决问题,您在this is up to the provider to authenticate using any available means这句话下隐藏了同样的问题,据我所知,这需要提供者再次实施密码流程,这反过来是有缺陷。必须有一种安全的方法来处理它。你知道吗?谢谢。
    • 提供者在实现隐式流时无需实现密码流。 “任何方式”是指涉及手机、眼睛扫描等的两因素身份验证。完全独立于任何已实施的 OAuth 流程。我猜你要么混淆了关于 OAuth 本身的一些概念,要么存在一些其他类型的误解。提供者自己验证用户名/密码与让您的应用发送用户名/密码并期望获得令牌完全不同。
    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 2017-05-23
    • 2021-07-13
    • 2020-02-28
    • 2011-10-20
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多