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



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

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

  2. 我需要让每个人都登录,这很烦人

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

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

编辑:歌曲应该通过调用SpotifyAPI来搜索,并不是每个人都有Spotify,因此我在考虑一个可以共享的令牌

不那么烦人,但不安全

移动应用

首次使用应用时:

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

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

浏览器

首次使用页面(或清除 Cookie 后(:

  1. 要求身份验证并设置长期存在的 Cookie。
  2. 将 cookie 存储在数据库中,该数据库与经过身份验证的用户相关,也与用户的播放列表相关。

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

如果您希望使用 OAuth 作为服务器和客户端之间的 TLS 手段,则每个用户都必须通过信息请求对服务器进行身份验证。

由于,我假设,这不是一个公共 API(供任何人访问数据(,因此您只希望您的客户端应用程序能够授权此类请求。

在这种情况下,您不需要向身份验证服务器发送"范围",只需生成资源令牌,但强制用户登录即可。

使用该资源令牌,客户端将向资源服务器发送第二个请求。在此请求中应保存该请求的操作和数据,并在收到后应从数据库中删除该令牌。不需要 CRON 工作。

Client -> Authentication Server
<- Resource Token (OK)
<- Status BAD
Client -> Resource Server { Resource Token, Action, Data }
<- Status OK
<- Status BAD
  • 检查令牌是否存在且"最新">
  • 检查操作是否允许
  • 检查数据是否超过 1 首歌曲
  • 执行插入,删除令牌并返回响应标头

不需要 CRON 作业的原因是,应为令牌设置超时。例如,向数据库添加一个(TIMESTAMP) created DEFAULT CURRENT_TIMESTAMP,从数据库中拉出该令牌的行,并确保它不是在n分钟前创建的,如果它是 void(过期(并且不能再使用。

下面是资源服务器的 URI 示例:

/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');

最新更新