在客户端存储客户端机密

时间:2019-08-13 10:39:08

标签: authentication oauth-2.0 authorization

我正在使用名为auth0的外部服务,以获取访问令牌并让我的用户使用我的api。 Auth0使用Oauth2协议。

简而言之,用户添加了用户名和密码,我正在通过使用client_id(应用程序具有ID)和client_secret来调用auth0,并且得到jwt访问令牌作为回报。然后从那里携带此访问令牌可以访问自己的api,因为我可以检查其有效性。

我一直在研究将client_id和client_secret存储在客户端(例如Web(javascript)/移动设备(本机或与ionic混合)的安全性),每个人都说这是不安全的,因为每个人都可以反向设计代码并获取client_id和client_secret。好的...我可以接受...如果我没有凭据来获取访问令牌,该如何处理?

鉴于我不想存储client_id和client_secret,我想到的一种解决方案是使用凭证直接调用我的api(Java),然后我的api调用auth0并返回相应的访问令牌。这样,将client_id和client_secret存储在后端中,并且有人无法轻松获取它们。这样安全吗?

但是我有一些端点,例如创建使用帐户,发送短信以进行电话验证等,但不能具有凭据。在这种情况下如何保护api?如果我无法在客户端上存储自己的访问令牌,该如何获取访问令牌并在没有凭据的情况下访问自己的api?

谢谢

3 个答案:

答案 0 :(得分:2)

我认为您几乎可以肯定使用了错误的OAuth流。我将Auth0和Ionic一起用作Web应用程序和本机Cordova应用程序。我的客户代码中根本没有客户机密。

如果您遵循Auth0快速入门(https://auth0.com/docs/quickstarts),则如果要部署到应用商店,则应该选择(本地/移动应用),如果要部署Web版本的应用,则应该选择(单页应用)。离子在这里,您可以选择Cordova(针对本机)或Angular(针对SPA)。这些应该为您提供实现OAuth流程的说明,这些流程不需要您的客户密码。我的猜测是您引用的是“常规Web应用程序”快速入门,该快速入门在服务器端运行,并且可以安全地保护客户端秘密。如果您使用的是Ionic Hybrid / Native,那不是您要编写的世界。

答案 1 :(得分:1)

OAuth规范建议的一种可能的解决方案是,您的应用程序可以具有三台不同的服务器。

客户端 后端服务器和其他身份验证服务器。

执行此操作的首选方法是客户端将用户凭据发送到身份验证服务器。身份验证服务器将是包含客户端机密的后端服务器 身份验证服务器将对凭据进行身份验证,然后返回令牌。

然后,客户端将使用从身份验证服务器获得的令牌来访问资源API服务器。

如果您想了解更多信息,请观看此视频 https://www.youtube.com/watch?v=rCkDE2me_qk

答案 2 :(得分:1)

我认为将对Auth0的调用包装到您自己的服务器端实现中是安全的。您的API会先获取用户凭据,然后调用Auth0,这样,client_id / secret在服务器上就很安全,并且可以在不损害安全性的情况下对客户端进行一路反向工程。

关于其他没有凭据的API,您很不走运。他们的用例将由未经身份验证的第三方使用,因此至少帐户创建API不能真正受到保护。但是,您仍然可以使用一些设计合理的约束来限制攻击面。例如。您可以要求一个电子邮件地址/电话号码进行注册,并且您将不允许两次使用相同的地址/电话号码。如果您设置了流程,则首先需要确认您的电子邮件地址,然后才能验证您的电话号码,这将使攻击者的生活更加困难。他将需要一个真实的工作电子邮件地址,并需要一些自动化才能接收您的确认邮件,然后才能致电您的SMS服务。您还可以对每个IP地址的服务进行速率限制,以使攻击者无法在短时间内发出大量用于SMS验证的呼叫,从而导致您的SMS成本飞涨。