对于我们正在构建的一组半公共REST API,我有一个简单的身份验证方案:
/-----------------------\
| Client POST's ID/Pass |
| to an Auth Service |
\-----------------------/
[Client] ------------POST----------------------> [Service/Authenticate]
|
/-------------------------------\
| Service checks credentials |
[Client] <---------Session Cookie------- | and generates a session token |
| | in a cookie. |
| \-------------------------------/
|
[Client] -----------GET /w Cookie -------------> [Service/Something]
|
/----------------------------------\
| Client must pass session cookie |
| with each API request |
| or will get a 401. |
\----------------------------------/
这很有效,因为除了接收cookie之外,客户端永远不需要做任何事情,然后传递它。对于浏览器应用程序,这会由浏览器自动发生,对于非浏览器应用程序,保存cookie并随每次请求发送它都非常简单。
但是,我还没有想出一个从浏览器应用程序进行初始握手的好方法。例如,如果这一切都是使用AJAX技术发生的,那么是什么阻止用户能够访问客户端用来与服务握手的ID / Pass?
看起来这似乎是这种方法的唯一绊脚石而且我很难过。
答案 0 :(得分:1)
一种可能性是为每个服务器AJAX页面生成一次性填充,并将该填充附加到会话cookie。现在,用户无法在没有一次性填充的情况下启动会话。当然,他们只需要一个新的页面就可以获得垫子。
答案 1 :(得分:0)
您无法获得此类服务。 This thread讨论了一些方法,但它们都不是一个好的解决方案。
如果要使用API控制第3个Partys,请强制它们使用服务器到服务器的连接。