我一直在寻找一段时间,绝对没有人能够正确回答这个问题。
我们说我有一个不受信任的"客户端应用程序:AngularJS前端。 这个前端想要到达我的api,因此用户必须先以某种方式进行身份验证。
因此,如果我使用的是oauth密码流,则用户必须在HTML表单中填写其凭据,Angular应用程序必须发送附加client_id和client_secret的请求。
我不明白的是,每个人和规范都说client_secret必须保密...
这很荒谬,您必须发送client_secret进行身份验证,但同时您必须将其与Javascript保持一致吗?
所以我的问题是:
如何在不泄露client_secret的情况下使用来自不受信任的客户端(Web前端或移动应用)的oauth密码流?
它是否可行或者根本不可能遵守此规范?
答案 0 :(得分:1)
您不应该使用密码流,而应使用不涉及client_secret的隐式(又名令牌)流程。
此流程专为仅限客户端的应用程序而设计,包括您所描述的JS前端应用程序。
除了您已注意到的问题之外,使用来自客户端应用的密码流可能会遇到身份验证问题。例如,假设身份提供者使用双因素身份验证,或者可能将身份验证委托给另一个提供者。使用密码流,这是您的应用程序要求用户名/密码,实际上没有办法处理这个。另一方面,隐式流程包括将流重定向到提供者,这取决于提供者使用任何可用方法进行身份验证。
您从隐式流程中获得的是您可以直接从客户端使用的令牌。