【问题标题】:OAuth2 client without access token没有访问令牌的 OAuth2 客户端
【发布时间】:2023-07-16 17:07:01
【问题描述】:

所以在开始之前,我是一个 OAuth2 新手,所以我仍然在尝试真正了解各种权限范围和授予。

我已经成功地使用 Laravel OAuth2 Server 包实现了 OAuth2 服务器。

我正在处理的当前站点将使用 client_credentials 授权类型从 API 中简单地进行测试。我已经成功地完成了这项工作,并且可以使用提供的访问令牌进行 API 调用。

但是,我想知道如何实现类似于 Instagram、Soundcloud 等的架构,它们不需要 access_token 用于基本端点,只需 client_id。他们怎么做到的?这是自定义授权类型吗?

最好,我只想在访问私有资源时开始需要访问令牌,例如用于修改用户信息的资源等。据我所知,对于这些我需要使用 @987654325 @grant 类型,这不是问题。

【问题讨论】:

    标签: php api oauth-2.0


    【解决方案1】:

    OAuth 有一些流程,例如 2-legged 或 3-legged,它们基本上告诉开发人员他需要向服务器发出多少请求才能获得他想要的资源。

    例如,在 2-legged flow 中,您发送一个带有您的 id 和密码的请求(第一个请求),您会返回一个 access_token 并使用该令牌您可以对资源发出其他请求你想要(第二个请求)。

    回到您的 Instagram 示例,您可以考虑仅使用 client_id 作为单腿 OAuth 流程,因为您只需向服务器发出一个请求即可获取所需资源。

    您可以将此类流程用于不太敏感的资源,例如个人资料照片或用户昵称。

    单腿流的实现很简单: - 如果user_id 有效且应用程序不需要用户批准即可访问请求的资源,则继续显示该资源。

    因此,实现单腿流程包括检查 client_id 是否有效以及检查所请求的资源是否需要用户许可。话虽如此,您可以使用 1-legged 来请求用户个人资料照片,但不能使用相同的流程来请求用户的私人消息。

    您可以在The OAuth Bible 中阅读有关每个 OAuth 流程的更多信息。

    【讨论】:

      【解决方案2】:

      您的服务器上有两种不同的资源 - a) 需要进行访问检查的资源 b) 可公开访问的资源。

      对需要访问检查的资源的操作应要求已通过请求中的 OAuth 标头识别用户。在 Laravel 的上下文中 - 这将是一个将 'before' 键指定为 Oauth 的路由。

      不需要访问权限的操作可以通过构建您的路由以接受一个为您提供有关用户的上下文的参数来收集有关用户相关的上下文。假设您有一个用户可以在没有任何访问权限的情况下查看的个人资料。您的 JSON 表示的 API 端点可能是 /api/profile/[user_id],其中 [user_id] 是您希望查看的用户配置文件的 ID。对于这些您不关心访问的路由,您可以在路由声明中的过滤器之前去掉 oauth。

      【讨论】:

      • 我明白,但不是我想要的。 Soundcloud、Instagram 等确实需要 client_id 作为其基本端点的安全性,并需要 access_token 作为安全端点。两者都是一种安全形式,后者更强大。他们不只是让他们的基本端点保持开放,这是我想要实现的。这将允许我的客户端应用程序避免不断请求访问令牌,直到用户实际登录。不幸的是,您的建议将使 API 在基本级别完全开放。