Php 在web和应用程序之间共享公共身份验证令牌

Php 在web和应用程序之间共享公共身份验证令牌,php,authentication,Php,Authentication,我想创建一个网站和应用程序,用户可以在其中搜索歌曲并将其收集到公共列表(保存到数据库)。因此,我不想让用户仅仅为了向列表中添加一首歌曲而对自己进行身份验证。因为您需要提供令牌才能进行搜索,所以我找到了几个选项: 我将把令牌保存到数据库中(使用CRON作业每小时刷新一次),当用户想要搜索时,我将检索代码并将其附加到客户端,以便请求成功。当然,这暴露了令牌,尽管它只能搜索,但它并不真正安全。PHP是没有选择的,因为它必须是一个网站和一个应用程序 我需要让每个人都登录,这很烦人 我需要制作一个PHP脚

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

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

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

  • 我需要制作一个PHP脚本,它将从客户端接收一些端点,并在服务器端执行它,然后将响应发送回来。然而,当有很多用户并且一个IP的速率限制将很快被激活时,这种方法的扩展性并不好

  • 还有其他选择吗

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

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

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

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

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

    Client -> Authentication Server
           <- Resource Token (OK)
           <- Status BAD
    
    Client -> Resource Server { Resource Token, Action, Data }
           <- Status OK
           <- Status BAD
    
    当然,数据应该是POST参数,但对于这一点,更容易将其显示为GET请求。它不需要保存所有数据,它可以是以下任何内容:

    ?song=[{"artist": "foo", "song": "bar"}]&type="json"
    
    使用它看起来像这样:

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

    如果您希望使用OAuth作为服务器和客户端之间TLS的一种方式,那么每个用户都必须使用信息请求对服务器进行身份验证

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

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

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

    Client -> Authentication Server
           <- Resource Token (OK)
           <- Status BAD
    
    Client -> Resource Server { Resource Token, Action, Data }
           <- Status OK
           <- Status BAD
    
    当然,数据应该是POST参数,但对于这一点,更容易将其显示为GET请求。它不需要保存所有数据,它可以是以下任何内容:

    ?song=[{"artist": "foo", "song": "bar"}]&type="json"
    
    使用它看起来像这样:

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

    不那么烦人,但不安全:

    移动应用程序

    首次使用应用程序时:

  • 需要身份验证并捕获设备UUID
  • 将设备UUID存储在数据库中,该数据库与经过身份验证的用户相关,也与用户的播放列表相关
  • 下次使用应用程序时,数据库中已经存在设备UUID,因此假设要使用的是相关的播放列表

    浏览器

    首次使用页面时(或清除cookies后):

  • 需要身份验证并设置长寿命cookie
  • 将cookie存储在数据库中,该数据库与经过身份验证的用户相关,也与用户的播放列表相关

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

    不那么烦人,但不安全:

    移动应用程序

    首次使用应用程序时:

  • 需要身份验证并捕获设备UUID
  • 将设备UUID存储在数据库中,该数据库与经过身份验证的用户相关,也与用户的播放列表相关
  • 下次使用应用程序时,数据库中已经存在设备UUID,因此假设要使用的是相关的播放列表

    浏览器

    首次使用页面时(或清除cookies后):

  • 需要身份验证并设置长寿命cookie
  • 将cookie存储在数据库中,该数据库与经过身份验证的用户相关,也与用户的播放列表相关

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

    无法理解此处的特殊情况。为什么现有的基于令牌的身份验证方案不起作用?如果您仍然不确定,您可以随时考虑实施一个已经回答的问题。不是每个人都有Spotify帐户,因此我不能要求每个人都登录登录登录以了解这里的特殊情况。为什么现有的基于令牌的身份验证方案不起作用?如果您仍然不确定,您可以随时考虑实施一个已经回答的问题。不是每个人都有Spotify帐户,因此我不能要求每个人都登录inI。如果编辑了我的问题,我将使用Spotify的API进行歌曲搜索,不是每个人都有Spotify,所以登录不是一个选项我编辑了我的问题,我使用Spotify的API进行歌曲搜索,不是每个人都有Spotify,所以登录不是一个选项不是每个人都有Spotify帐户,所以我不能要求每个人登录不是每个人都有Spotify帐户,因此,我不能要求所有人都登录