代码之家  ›  专栏  ›  技术社区  ›  jerhinesmith

使用令牌的基于服务的身份验证

  •  13
  • jerhinesmith  · 技术社区  · 16 年前

    我很难找到使用令牌实现基于服务的身份验证方案的清晰简洁的例子。据我所知,基本步骤如下:

    1. 客户端向用户请求用户名/密码
    2. 客户端将用户名/密码传递给身份提供程序
    3. 提供程序检查用户名/密码,并在用户有效时发送回令牌
    4. 客户机用令牌做了什么?

    第三步和第四步是我陷入困境的地方。我假设在这种情况下,“令牌”必须是客户机可以解密的加密字符串,或者是存储在客户机可以验证的某个地方(即数据库)的随机字符串,但我不确定客户机对令牌应该做什么,或者为什么您甚至需要令牌——不能简单地说是我们我也够了吗?

    5 回复  |  直到 10 年前
        1
  •  25
  •   Cheeso    10 年前

    我假设在这种情况下“令牌”只是 必须是加密字符串 客户端可以解密或 存储的随机字符串 在某个地方(如数据库)的 然后客户端可以验证,但是 我不太确定客户是什么 然后应该用代币或者 为什么你甚至需要一个代币-- 一个简单的用户ID也不能 够了吗?

    不-代币是“乘车票”,就像地铁代币一样。客户在请求服务时将其呈现给门卫。在这种情况下,提供程序进行自己的身份验证,因此客户机将令牌返回给提供程序。在某些情况下,提供者可能委托身份验证-例如 the STS model 在这种情况下,提供者可能会将令牌交给第三方进行身份验证甚至授权。

    从服务角度来看,此令牌必须:

    • 有“保质期”。否则,令牌将无限地可重用。因此,在服务器端,您可以将令牌存储在基于会话的存储中,在该存储中您可以免费获得超时。或者,您可以构建一个具有到期的简单哈希表。
    • 仅与持有人有关。在许多情况下,提供程序在这里使用近似值,并断言令牌只能从原始请求IP地址使用。

    因此,在步骤3中,提供者需要检查用户名和密码。如果验证有效,则创建一个标记(哈希),它引用字典或哈希表中的条目。哈希表中的对象是包含用户名、IP地址、可能是原始发布时间、可能是与用户名关联的角色以及您希望存储的其他内容的结构。服务提供者将这个令牌(散列,而不是结构)发送回客户机,通常作为一个集合cookie。当客户机在随后的请求中发送回令牌(作为cookie)时,提供者检查字典以查看令牌是否可用、是否超时、是否与请求的IP地址匹配、是否为请求的资源授权等。如果一切正常,则执行请求。


    编辑2013六月

    已经有好几年了,这个答案仍在获得选票。 我建议人们研究OAuth2.0框架,并携带令牌。

    基本上,他们只是做这里描述的事情。

    如果您想要一个好的示例实现,您可以查看 Apigee's Usergrid. 它是这样工作的:

    1. 用户身份验证

      POST https://api.usergrid.com/token -d '{"username":"Joe","password":"Sec4et!","grant_type" : "password"}'

    2. 用户收到一个访问令牌作为响应

    3. 用户使用头进行后续调用 Authorization: Bearer XXXXXXXXXX 其中,XXXXX替换为不记名代币。这个令牌有一个由usergrid服务器设置的生存时间。

        2
  •  1
  •   chaos    16 年前

    典型的令牌是存储在服务器端的随机哈希。客户机将其与请求一起返回。这让你得到的是,你不必一直传递密码,这显然是对好的,令牌可以随时失效,而无需更改密码。

        3
  •  1
  •   gsobocinski    16 年前

    当我研究同一个问题时,我发现AmazonS3的文档很有用。

    Authenticating REST Requests

    一般的原则是,您不想在每次连续的服务调用中传递用户名和密码,因为这样做不太安全。

    您提到过只是将用户名传回服务,但是这不会非常安全。

    您可能在考虑使用会话状态来存储用户已经过身份验证的事实,但是这违背了REST的一个一般原则,即所有内容都应该是无状态的。

        4
  •  0
  •   grawity_u1686    16 年前

    这看起来很像 Kerberos 作品。

        5
  •  0
  •   redben    15 年前

    带有会话的Web服务……嗯,这不是它应该的样子。Web服务并不意味着保持状态。
    我在网上查阅了很多关于ssl/tls+用户名/密码的例子和文章。用“api-key”基础设施替换用户名/密码是很好的,但是我不知道如何“设计”这样的东西……