API设计:HTTP基本身份验证与API令牌

Sim*_*tti 52 architecture authentication api basic-authentication

我目前正在为Web应用程序的公共Web API前面创建一个身份验证系统.鉴于每个用户帐户都有一个API密钥,并且每个请求都必须经过身份验证,我有两种选择:

  1. 使用HTTP基本身份验证,就像GitHub一样.

    请求必须发送到URL

    http://api.example.com/resource/id
    with basic authentication
    username: token
    password: the api key
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将API令牌作为查询字符串参数传递.

    请求必须发送到URL

    http://api.example.com/resource/id?token=api_key
    
    Run Code Online (Sandbox Code Playgroud)

还有第三个选项是在URI中传递令牌,但老实说我不喜欢这个解决方案.

您会采用哪种解决方案?为什么?

Yar*_*rin 34

最好的选择可能是在标题中使用API​​密钥(例如'授权:令牌MY_API_KEY')而不是作为url参数:

HTTP Basic Auth的优点:

  • 更方便,因为您可以轻松过期或重新生成令牌而不会影响用户的帐户密码.
  • 如果受到破坏,漏洞仅限于API,而不是用户的主帐户
  • 每个帐户可以有多个密钥(例如,用户可以并排使用"测试"和"生产"密钥.)

URL中的API密钥优势:

  • 通过防止用户无意中使用其中嵌入的凭据共享URL来提供额外的安全措施.(此外,URL可能会出现像服务器日志这样的事情)

  • 这种比较没有任何意义.Basic Auth相当于将标记放在标题中.`https:// my_token:@ api.example.com`将导致标题`Authorization:Basic [base64-encoded-token-goes-here]`. (22认同)
  • @sandstrom它可能在功能上等同于只是将用户名传递给Basic auth,但重点是使用可刷新的令牌而不是实际的帐户凭据,并且`Authorization:Token`使其明确.http://techblog.thescore.com/2014/06/25/http-basic-authentication-and-http-token-authentication/ (4认同)

小智 17

很多时候我不得不考虑如何在API上验证用户/请求,并且在比较更多解决方案之后,我最终使用了我不需要的Amazon解决方案,或者我无法使用OAuth.此解决方案基于签名,防止"中间人"问题,因为基本身份验证和传递简单令牌正在发送纯文本数据.是的,你可以添加ssl,但这会增加系统的复杂性......


Die*_*ini 12

我认为HTTP Basic Auth应该没问题,只是为了满足非常简单的需求.

完整(和最终)解决方案IMHO将实施OAuth提供程序.它并不复杂,它是一个简单的协议,为您提供了很大的灵活性.此外,它似乎是当前的趋势,因为许多大型玩家实现它,并且它得到许多图书馆的支持.

  • 考虑到上面列出的URL,这种危险不是https,而是简单的旧http://.任何人都可以使用像Firesheep这样的工具来获取API密钥和令牌,因为Basic Auth不会为这些凭据提供任何隐私.当大多数API提供商使用http*s*时,你应该**仅考虑基本身份验证,包括[Github](http://developer.github.com/v3/#authentication). (20认同)
  • 我认为OAuth对于这种服务来说太过分了.在这种情况下,为什么要选择Basic Auth? (3认同)
  • 如果您需要向第三方颁发授权(例如"代客密钥"),则需要OAuth,但我没有看到许多API仅为客户端到服务访问实现它.也许这会随着OAuth 2变得更受欢迎而改变,但你仍然要求用户做更多的工作来连接. (3认同)
  • 在这种情况下,HTTP Basic Auth在我看来更优雅.主要是因为它是标准的,没有人需要思考新事物. (2认同)
  • 如何使用HTTPS Basic Auth?它不是比HTTP基本身份验证更安全吗?Oauth要求您提出一些请求,直到您获得令牌 (2认同)