【问题标题】:Proper way to authenticate with a backend server使用后端服务器进行身份验证的正确方法
【发布时间】:2016-09-06 16:01:19
【问题描述】:

根据doc,为了通过后端服务器进行身份验证,我必须:

  • 使用 HTTPS 将用户的 ID 令牌发送到我的服务器。
  • 验证 ID 令牌的完整性并从 ID 令牌的子声明中检索用户的 ID。

这工作得很好,但是如果我必须对服务器的所有请求进行身份验证怎么办?

我应该存储 idToken(在私人共享偏好上)并在每次服务器端验证它吗?由于 idToken 有一个有效期,所以客户端必须能够在过期后重新生成它。

或者在第一次连接时,我应该向用户返回一个 ID(没有有效期),这将允许他与服务器通信(似乎不太安全)?

【问题讨论】:

  • 嗨,Thomas,只是想了解您从 GoogleSignInOptions 检索的令牌是否是 JWT,对吗?该令牌的有效期仅为 1 小时。您能帮我了解如何更新此令牌吗?我从 GSO 获得了相同的 JWT,即使它已过期
  • 是的,这是 JWT。您必须在每次 API 调用之前调用 silentSignIn。看到这个answer
  • 当我在一小时后打电话给silentSignIn 时,我仍然得到相同的旧令牌。这是我的问题stackoverflow.com/questions/37363213/…

标签: android authentication google-signin


【解决方案1】:

令牌应该在对服务器的每个请求中进行验证,它就像每个请求的密钥一样。此密钥在很长一段时间内无效,因此如果您希望“会话”持久存在,您通常有一个刷新令牌。如果没有,则每次令牌有效期到期时都需要重新进行身份验证。

所以是的,您应该将令牌存储在客户端。最佳做法是设置一个非常短的有效期,以确保如果令牌被泄露,攻击者将有很短的时间进行恶意操作。

【讨论】:

  • 谢谢。好像我没有刷新令牌,所以每次过期我都会验证。
【解决方案2】:

我在silentSignIn() 方法的文档中找到了一个技术答案(@EmCode 的答案是正确的)。 (这里是link)。

GoogleSignInResult 可能包含一个 ID 令牌,可用于验证和识别您与应用服务器建立的会话。如果您使用 ID 令牌到期时间来确定您的会话生命周期,您应该检索一个刷新的 ID 令牌,方法是在每次 API 调用您的应用程序服务器之前调用 silentSignIn。

【讨论】:

    【解决方案3】:

    看看这是否有意义:

    这个工作很好,但是如果我必须对服务器的所有请求进行身份验证怎么办?

    我认为 google 登录的目的是通过用户的 google 凭据对用户进行身份验证。它并不是真正用于针对您自己的服务器验证您的所有客户端请求。你的服务器和谷歌之间会发生什么应该只是用户令牌验证。一旦令牌验证良好,后续的 C/S 数据交换就可以使用您选择的身份验证,无需每次都麻烦谷歌或关心令牌的有效性。

    如果您使用 ID 令牌到期时间来确定您的会话生命周期,您应该检索刷新的 ID 令牌,方法是调用 在对您的应用程序服务器进行每次 API 调用之前的silentSignIn。

    是的,如果您的应用程序使用会话并且您希望令牌定义有效性,那么您需要一直打扰 Google。

    【讨论】:

      【解决方案4】:

      使用后端服务器进行身份验证的正确方法是改造使用此库,这样在后端服务器上获取数据或上传数据非常快。

      【讨论】:

      • Retrofit 是一个 http 客户端(我已经在使用它了)。这不能回答我的问题
      猜你喜欢
      • 2022-07-11
      • 1970-01-01
      • 2023-03-22
      • 2021-08-17
      • 1970-01-01
      • 2021-12-05
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多