【问题标题】:Share common authentication token between web and app在 Web 和应用程序之间共享通用身份验证令牌
【发布时间】:2019-03-23 16:29:44
【问题描述】:

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

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

  2. 要让大家登录,很烦人

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

我还有其他选择吗?

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

【问题讨论】:

  • 无法理解这里的特殊情况。为什么现有的基于令牌的身份验证方案不起作用?
  • 如果您仍然不确定,您可以随时考虑实施 Token based authentication 已回答的问题。
  • 不是每个人都有 Spotify 帐户,所以我不能要求每个人都登录

标签: php authentication


【解决方案1】:

不那么烦人但不安全:

移动应用

第一次使用该应用:

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

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

浏览器

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

  1. 要求身份验证并设置一个长寿命的 cookie。
  2. 将cookie存储在与认证用户相关的数据库中,也与用户的播放列表相关。

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

【讨论】:

  • 不是每个人都有 Spotify 帐户,所以我不能要求每个人都登录
【解决方案2】:

如果您希望使用 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
  • 检查令牌是否存在并且“在日期”
  • 检查该操作是否被允许
  • 检查数据是否超过 1 首歌曲
  • 执行插入,移除令牌并返回响应头

您不需要 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');

【讨论】:

  • 我已经编辑了我的问题,我正在使用 Spotify 的 API 进行歌曲搜索,并不是每个人都有 Spotify,因此无法让每个人都登录
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 2011-05-01
  • 1970-01-01
  • 2011-11-04
  • 2011-03-27
  • 2023-03-06
  • 1970-01-01
  • 2016-09-17
相关资源
最近更新 更多