如何使用Laravel管理OAuth刷新令牌?

时间:2015-11-29 20:59:49

标签: laravel oauth laravel-5.1 google-api-php-client laravel-socialite

Socialiate插件为Laravel中的OAuth提供了一个实现,但它似乎主要是为了让他们不必在自己的网站上建立用户帐户。

我正在创建一个有助于管理其Youtube帐户的应用程序,这意味着auth请求的范围更广(容易更改)但我还需要刷新令牌(而不仅仅是访问令牌)以进行长期访问他们的帐户。

Laravel是否有一个已经处理过的包裹?我找不到一个,但也许我正在寻找错误的东西。

如果没有,我该如何处理?当我编写与Youtube的API交互的代码时,我是否只需要检查访问令牌是否过期,如果是,请编写一个执行HTTP请求的函数来获取一个带有我存储在其中的刷新令牌的新请求数据库?我想还会扩展Socialite以检索刷新令牌?

我觉得必须有更好的方法,不要让我重新发明轮子。

2 个答案:

答案 0 :(得分:17)

自上次访问此问题以来已经有一段时间了,并且看到这是Google的第一个结果,我想说:现在可以使用社交网站。

当您将用户重定向到Google时,请在重定向时使用access_type方法将offline设置为with(),如下所示:

    return Socialite::driver('google')
        ->scopes() // For any extra scopes you need, see https://developers.google.com/identity/protocols/googlescopes for a full list; alternatively use constants shipped with Google's PHP Client Library
        ->with(["access_type" => "offline", "prompt" => "consent select_account"])
        ->redirect();

这将使Google返回刷新令牌。

答案 1 :(得分:2)

这很难找到信息,部分原因是Laravel的OAuth2服务器软件包提供了自己的OAuth解决方案,这是大多数搜索结果。

我认为最好的答案是为Socialite编写自己的YoutubeProvider。这是一个教程:anonymous class

将Socialite更改为开始使用刷新令牌将会很痛苦,所以我认为最好的路线是让YoutubeProvider在现有的getAccessToken函数末尾另外调用一个新的getRefreshToken函数。更改访问权限和刷新令牌以将检索到的令牌保存到数据库,因为Socialite不会为您提供访问刷新令牌以将其保存在帮助程序/控制器类中的选项。

创建令牌模型和数据库表,并在其中存储访问和刷新令牌,并与用户模型建立关系。

当您编写YoutubeService帮助程序时,它需要能够尝试使用访问令牌进行API调用,并知道如果收到错误消息表明它已过期/无效,则使用刷新令牌对其进行刷新。

Google的PHP API库似乎会自动使用String[] cols = {"Name","Location"}; String[][] data = new String[][] {{"Name","Location"}}; JTable table = new JTable(new DefaultTableModel(date, cols)); 处理此问题:https://medium.com/laravel-news/adding-auth-providers-to-laravel-socialite-ca0335929e42#.6bn8i2wz4

但是一旦你开始需要刷新令牌以换取谷歌以外的其他东西,如果新的提供者也没有图书馆,那么无论如何你都要编写该代码。从好的方面来说,这个库有一个专门用于Youtube的服务,所以它应该处理你可能需要的所有对Youtube的API调用。我不确定如何使用这个库与Socialite进行网格划分,因为Socialite似乎已经做了很多这个库的工作。您可能最终会在YoutubeService类中进行某种冗余授权,除非您真的想要开始自定义。

在谈到他们的服务时,可能值得考虑将Socialite完全从等式中移除并使用Google的库。