我想创建一个网站和应用程序,用户可以在其中搜索歌曲并将其收集到公共列表(保存到数据库)中。因此,我不想让用户验证自己的身份,而只是向列表中添加1首歌曲。因为您需要提供令牌才能搜索,所以我找到了几种选择:
我将令牌保存到数据库中(使用CRON作业每小时刷新一次),并且当用户想要搜索时,我将检索代码并将其附加到客户端,以便请求成功。当然,这会公开令牌,即使它只能搜索,也不是很安全。 PHP是不可选择的,因为它必须是一个网站和一个应用程序
我需要让所有人都登录,这很烦人
我需要制作一个PHP脚本,该脚本将从客户端接收一些终结点,并将在服务器端执行该脚本并将响应发送回去。但是,当有很多用户时,这种扩展的效果不是很好,并且一个IP的速率限制将很快被激活。
我还有其他选择可以尝试吗?
编辑: 应该通过调用Spotify API来搜索歌曲,并非所有人都有Spotify,因此我在考虑可以共享的令牌
答案 0 :(得分:1)
如果您希望使用OAuth作为服务器和客户端之间的TLS手段,则每个用户都必须使用信息请求针对服务器进行身份验证。
由于我假设这不是公共API(任何人都可以访问数据),所以您只希望您的客户端应用能够授权此类请求。
在这种情况下,您无需向身份验证服务器发送“作用域”,只需生成资源令牌,然后强制用户登录即可。
使用该资源令牌,客户端将向资源服务器发送第二个请求。在此请求内应保存该请求的ACTION和DATA,然后在收到请求后应从数据库中删除该令牌。不需要CRON作业。
Client -> Authentication Server
<- Resource Token (OK)
<- Status BAD
Client -> Resource Server { Resource Token, Action, Data }
<- Status OK
<- Status BAD
不需要CRON作业的原因是,您应该为令牌设置超时。例如,将(TIMESTAMP) created DEFAULT CURRENT_TIMESTAMP
添加到数据库中,将该行从数据库中拔出,以确保该令牌在 n 分钟前没有创建(如果它是空的)(过期),无法再使用。
这是资源服务器的URI example:
/api/resource_token/action?data=
当然,数据应该是POST参数,但为此,将其显示为GET请求更加容易。它并不需要保存所有数据,它可以是:
?song=[{"artist": "foo", "song": "bar"}]&type="json"
使用AltoRouter看起来像这样:
$router->map('GET|POST', '/api/[*:token]/[*:action]', function($resourceToken, $requestAction) {
foreach(array('Song', 'Type', 'PlaylistId') as $param)
if(!isset($_POST[$param]))
die(...Return your response header error...);
if(($token = SomeModel::getToken($resourceToken))->isValid())
SomeController->using($token)->execute($requestAction);
die(...Return your response header success...);
}, 'API');
答案 1 :(得分:1)
烦人的但不安全:
移动应用
首次使用该应用程序:
下次使用该应用程序时,设备UUID已存在于数据库中,因此假定相关的播放列表是要使用的播放列表。
浏览器
第一次使用该页面(或清除cookie后):
下次使用该页面时,该cookie将已经存在,因此假定相关播放列表是要使用的播放列表。