慕运维8079593
我们正在公开一个API,合作伙伴只能在他们向我们注册的域上使用。它的内容部分是公开的(但最好仅在我们已知的域中显示),但大部分对我们的用户是私有的。所以:要确定什么是所示,我们的用户必须和我们一起登录,但这是分开处理。要确定其中显示的数据,公共API密钥是用来限制进入我们知道域,首先要保证用户私有数据不会受到CSRF。这个API密钥的确对所有人可见,我们不会以任何其他方式对我们的合作伙伴进行身份验证,并且我们不需要REFERER。仍然是安全的:当我们get-csrf-token.js?apiKey=abc123被要求时:abc123在数据库中查找密钥,并获取该密钥的有效域列表。查找CSRF验证cookie。如果不存在,则生成一个安全的随机值,并将其放入仅HTTP的会话cookie中。如果cookie存在,则获取现有的随机值。从API密钥创建CSRF令牌,从cookie创建随机值,并对其签名。(我们不是在服务器上保留令牌列表,而是对值进行签名。两个值都可以在签名的令牌中读取,这很好。)将响应设置为不缓存,添加cookie,然后返回如下脚本:var apiConfig = apiConfig || {};if(document.domain === 'expected-domain.com' || document.domain === 'www.expected-domain.com') { apiConfig.csrfToken = 'API key, random value, signature'; // Invoke a callback if the partner wants us to if(typeof apiConfig.fnInit !== 'undefined') { apiConfig.fnInit(); }} else { alert('This site is not authorised for this API key.');}笔记:以上并不妨碍服务器端脚本编造一个请求,但只有保证了域匹配,如果浏览器请求。在JavaScript的同源策略确保浏览器无法使用XHR(阿贾克斯)加载,然后检查JavaScript源。相反,常规浏览器只能使用