首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在客户端存储客户端机密

在客户端存储客户端机密
EN

Stack Overflow用户
提问于 2019-08-13 18:39:08
回答 3查看 3.6K关注 0票数 1

我使用一个名为auth0的外部服务来获取访问令牌,并让我的用户使用我的应用程序接口。Auth0使用的是Oauth2协议。

简而言之,用户添加用户名和密码,我使用client_id (应用程序有一个id)和client_secret调用auth0,然后我得到一个jwt访问令牌作为回报。然后从那里我携带这个访问令牌来访问我自己的api,因为我可以检查它的有效性。

我一直在研究在客户端存储client_id和client_secret的安全性(例如web (javascript)/mobile (原生的或与ionic混合的)),每个人都说这不安全,因为每个人都可以反向工程代码并获得client_id和client_secret。好的……我可以使用it...what,如果我没有凭据来获取访问令牌,我可以使用它们吗?

考虑到我不想存储client_id和client_secret,我想过的一种解决方案是使用凭据直接调用我的api (Java),然后我的api调用auth0并返回相应的访问令牌。通过这种方式,client_id和client_secret被存储在后台,不容易被人获取。这样安全吗?

然而,我有一些端点,例如创建使用帐户,发送手机验证短信等,不能有凭据。在这种情况下,如何保护api?如果我不能在客户端存储我自己的访问令牌,我如何获得访问令牌并在没有凭据的情况下访问我自己的api?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2019-08-13 18:52:37

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

客户端后端服务器和附加的认证服务器。

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2019-08-13 21:11:10

在我看来,您几乎肯定使用了错误的OAuth流。我使用带有Ionic的Auth0作为web应用程序和原生Cordova应用程序。我的客户端代码中根本没有客户端机密。

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

票数 2
EN

Stack Overflow用户

发布于 2019-08-13 18:53:02

我认为将对Auth0的调用封装到您自己的服务器端实现中是安全的。您的应用程序接口获取用户凭证,然后调用Auth0,这样您的client_id/secret在您的服务器上是安全的,并且客户端可以被完全逆向工程,而不会损害您的安全性。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57476021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档