我正在寻找为我的应用程序创建(REST)API.初始/主要目的是供移动应用程序(iPhone,Android,Symbian等)使用.我一直在研究基于Web的API的身份验证和授权的不同机制(通过研究其他实现).我已经掌握了大部分基本概念,但我仍在寻找一些领域的指导.我想做的最后一件事就是重新发明轮子,但我找不到任何符合我标准的标准解决方案(不过我的标准是我的误导,所以也可以随意批评).此外,我希望API对于使用它的所有平台/应用程序都是相同的.
我会继续向oAuth抛弃我的反对意见,因为我知道这可能是第一个提供的解决方案.对于移动应用程序(或更具体地说是非Web应用程序),离开应用程序(转到Web浏览器)进行身份验证似乎是错误的.此外,没有办法(我知道)浏览器将回调返回给应用程序(特别是跨平台).我知道有几个应用程序可以做到这一点,但它只是感觉不对,并且在应用程序用户体验中取得了突破.
外部开发人员将请求API帐户.他们将得到一个apikey和apisecret.每个请求至少需要三个参数.
需要apikey来识别发出请求的应用程序.时间戳的作用与oauth_nonce类似,可以避免/减轻重放攻击.哈希确保请求实际是从给定apikey的所有者发出的.
对于经过身份验证的请求(代表用户完成的请求),我仍然未决定使用access_token路由或用户名和密码哈希组合.无论哪种方式,在某些时候都需要用户名/密码组合.因此,当它发生时,将使用几条信息(apikey,apisecret,timestamp)+密码的散列. 我喜欢这方面的反馈. 仅供参考,他们必须首先对密码进行哈希处理,因为我没有在没有散列的情况下将密码存储在我的系统中.
仅供参考,这不是要求如何构建/构建API,一般只是如何仅在应用程序内处理身份验证和授权.
对于只需要apikey作为请求的一部分的API,如何防止apikey所有者以外的其他人能够看到apikey(因为明确发送)并过多地请求推送它们超过使用限制?也许我只是在想这个,但是不应该有一些东西需要验证是否已向apikey所有者验证了请求?在我的情况下,这是apisecret的目的,它不会被显示/传输而不被散列.
说到哈希,md5和hmac-sha1怎么样?当所有值都用足够长的数据(即apisecret)进行散列时,这真的很重要吗?
我之前一直在考虑为用户密码哈希添加每用户/行盐.如果我这样做,应用程序如何能够在不知道使用的盐的情况下创建匹配的哈希?
我正在开发使用后端的一些流行的Web框架的宁静的Web应用程序,例如(rails,sinatra,flask,express.js).理想情况下,我想用Backbone.js开发客户端.如何让我的javascript客户端与这些API调用进行交互?我不希望这些API调用是公共的,curl只是通过在浏览器上输入链接来调用.
在创建基本REST服务之后,我已经到了适当的位置来添加某种密码保护,因为我需要验证我的用户是否都已正确记录并且具有足够的权限来执行他们所做的任何操作即将.
REST服务将主要从一个Javascript前端访问,考虑到这一点,我已经提出了以下两个替代方案来解决这个问题:
首先通过向/login页面发送凭据来使用户登录POST.该页面设置会话cookie,其中用户被标记为已登录,以及权限级别.在每个后续请求中,我验证用户是否已登录以及他/她的权限级别.会话到期时,自动或手动(注销,用户必须重新登录).
临时保存本地散列的凭据,并在用户发出的每个请求中发送用户凭据,以便根据请求验证凭据和权限后端.
有更多方法可以解决这个问题,还有其他一些我应该关注的问题吗?
我有一个简单的HTML5 Canvas游戏,在一部分的最后我想在MySQL中存储变量.使用XMLHttpRequest,Ajax或其他方法做到这一点是否安全?这就是我开始编写它的方式:
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
var success = request.responseText;
alert(success);
}
}
request.open('GET', 'saveLevel.php?name='+name+'&level='+level, true);
request.send();
Run Code Online (Sandbox Code Playgroud)
我的问题是每个人都可以在控制台中这样做:
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
var success = request.responseText;
alert(success);
}
}
request.open('GET', 'saveLevel.php?name='+name+'&level=100', true);
request.send();
Run Code Online (Sandbox Code Playgroud)
(怎么样)我能解决吗?