react-native - 如果客户端密码不用于具有后端 api 的 React Natvie (ios/android) 应用程序中的 Google 登录,那么客户端密码的目的是什么?这如何安全?
问题描述
我已经从我要去的地方谷歌登录反应原生应用程序(让我们说 ABC),我得到 idToken 并使用 Https 安全地发送到后端服务器,然后它验证 idToken 并获取 accessToken。但在整个过程中,clientSecret 并没有在任何地方使用。任何人都可以使用我的客户 ID,比如说应用 XYZ 来访问用户数据。这如何安全?
另一方面,在我使用护照的反应网站和后端服务器中,需要客户端密码。我在这里错过了什么吗?
如果原生应用程序中使用的流程是安全的,我可以在 react 网站中使用相同的流程,即摆脱护照策略。
解决方案
客户端 ID 包含在提供给浏览器的 HTML 中,正如您指出的那样,它不安全——也不是有意的。客户端 ID 只是标识应用程序。
对于Web 应用程序,需要授权的 JavaScript 源,对于后端服务,还需要授权的重定向 URI。请求/响应由 Google 的 OAuth 服务使用这些设置进行验证。
HTTPS,其中包括一个签名证书是必需的,它有助于确保流量来自您的已验证域托管和提供的源。
对于登录响应,通常使用可以在后端安全验证的签名 JWT(除非使用 OAuth 2.0 或 gapi)。
客户端密钥当然不应该包含在提供给浏览器的 HTML 中,并且应该只保存在安全位置、不受源代码控制和后端服务器上。
使用 nonce 还可以帮助您避免重放攻击。查看纯服务器端应用程序的 状态变量,或 Sign In With Google nonce属性。
推荐阅读
- azure - 如何将多个键值对作为 ENV 变量从 Azure 密钥库机密加载到 k8s POD
- jakarta-ee - 在 Quarkus 中使用 @RolesAllowed 和自定义 JWT 验证,没有 smallrye-jwt
- jquery - 在 jQuery 中,如果元素包含属性,无论其值如何,我如何找到它们?
- python - 在括号内使用python for循环
- r - 对称共生矩阵的最小重叠
- ios - iOS 使用外部键盘显示/隐藏屏幕键盘
- c# - Unity配色游戏
- html - 如何扩展 DIV 的底部边框,使其溢出其父级的底部边框?
- sql - 需要按特定列值过滤的联接表
- javascript - VueJS v-for 渲染列表,尽管 v-if 评估为 false