在网络和应用之间共享通用身份验证令牌

时间:2018-10-18 19:29:11

标签: php authentication

我想创建一个网站和应用程序,用户可以在其中搜索歌曲并将其收集到公共列表(保存到数据库)中。因此,我不想让用户验证自己的身份,而只是向列表中添加1首歌曲。因为您需要提供令牌才能搜索,所以我找到了几种选择:

  1. 我将令牌保存到数据库中(使用CRON作业每小时刷新一次),并且当用户想要搜索时,我将检索代码并将其附加到客户端,以便请求成功。当然,这会公开令牌,即使它只能搜索,也不是很安全。 PHP是不可选择的,因为它必须是一个网站和一个应用程序

  2. 我需要让所有人都登录,这很烦人

  3. 我需要制作一个PHP脚本,该脚本将从客户端接收一些终结点,并将在服务器端执行该脚本并将响应发送回去。但是,当有很多用户时,这种扩展的效果不是很好,并且一个IP的速率限制将很快被激活。

我还有其他选择可以尝试吗?

编辑: 应该通过调用Spotify API来搜索歌曲,并非所有人都有Spotify,因此我在考虑可以共享的令牌

2 个答案:

答案 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)

烦人的但不安全

移动应用

首次使用该应用程序:

  1. 需要身份验证并捕获设备UUID。
  2. 将设备UUID存储在数据库中,该UUID与已认证的用户相关,也与用户的播放列表相关。

下次使用该应用程序时,设备UUID已存在于数据库中,因此假定相关的播放列表是要使用的播放列表。

浏览器

第一次使用该页面(或清除cookie后):

  1. 需要身份验证并设置一个长期存在的cookie。
  2. 将cookie存储在与经过身份验证的用户以及用户的播放列表相关的数据库中。

下次使用该页面时,该cookie将已经存在,因此假定相关播放列表是要使用的播放列表。