【问题标题】:Token-based authentication from a mobile app来自移动应用程序的基于令牌的身份验证
【发布时间】:2015-11-11 15:41:13
【问题描述】:

我正在学习使用 JSON Web 令牌的基于令牌的身份验证,这是我现在对移动应用程序的看法,例如,斯威夫特:

  1. 我可以使用用户输入在应用程序内创建一个对象,例如

    { 用户名:“帕特里克巴特曼”, 密码:“ismyknifesharp”, 角色:“常规”, ... }

  2. 然后我可以使用 library 从中生成 JWT 令牌。

  3. 然后我将其发送到支持的 API 端点,例如 /api/contacts/list。还是我必须按原样发送登录名/密码才能进行身份验证?
  4. 服务器以某种方式检查令牌的正确性。但是怎么做?这个服务器生成的令牌是否应该保存在数据库中并用作密钥?还是每次从客户端收到请求并将其与客户端令牌进行比较时,我必须在服务器上生成令牌?
  5. 获取和管理我需要的所有数据。

这是我的结论:

  1. 我不需要向服务器发送登录名/密码对来验证用户身份。
  2. 每次需要获取仅授权数据时,我都需要发送令牌。
  3. 我应该实现一些算法,由于某些因素(例如时间流逝)而更改生成的令牌,从而使令牌过期。
  4. 我应该在标头中发送令牌,但不一定,因为它可以在 JSON 请求的正文中完成。

这些结论正确吗?客户端发送的token通过什么方式查看?

【问题讨论】:

    标签: ios json authentication jwt


    【解决方案1】:

    我的意见:

    1. 我们不应该在客户端保留用户密码。客户端在注册/登录时应将密码发布到服务器,并且不要将其保存在客户端的任何位置。请求应为https,密码不应加密。稍后我们将在服务器端加密密码。

    2. 用户登录成功后,服务器将为此用户生成一个token。 token 本身将包含过期日期。我们将使用令牌向服务器验证权限。

    3. 我认为对 API 的每个请求都应该提供令牌,除了注册/登录/忘记密码请求。

    4. token 应该放在请求头中。

    5. 服务器应允许客户端使用旧令牌(可能已过期)请求新令牌

    以及“如何服务器检查来自客户端的令牌?”的答案。有很多方法可以做到这一点。下面的方式是我目前的做法:

    服务器端生成一个token,它是一个user info的加密字符串(如token过期时间、用户ID、用户角色...)和一个密码(只保留在服务器端),使用HMAC或RSA算法.当用户提交token时,服务器可以解密得到user info,过期时间无需从数据库中查询。

    无论如何,这个问题与Swift标签无关。

    【讨论】:

    • 为什么在客户端保留密码和用户名不是一个好主意?在 iOS 中,我们可以将它们安全地存储在 Keychain 中吗?
    • 即使我们可以以安全的方式存储它们,但没有任何好处。我们不应该使用存储的密码重新登录。好的方法是使用令牌或要求用户通过登录表单再次提供密码。
    • 我明白了。如果我们要使用 jwt 并刷新令牌。我们是否应该在发送任何 http 请求之前确定 jwt 在客户端是否已过期?还是我们应该让 jwt 过期并在进入刷新周期之前给客户端一个 400?
    • 在我看来,正确的方式是第二选择。 BTW,我认为我们无法确定jwt的过期时间,因为我们在服务器上保留了secret key,我们如何解密令牌?
    • 但是我们不是在标题中保留 iat 和过期时间吗?我们不能只使用标头中的信息来确定令牌是否过期吗?
    猜你喜欢
    • 2016-11-20
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2014-06-04
    • 2017-03-10
    • 2021-01-25
    • 2016-01-23
    • 2016-01-29
    相关资源
    最近更新 更多