使用OAuth2的laravel中的自定义用户提供程序

Noi*_*oir 5 php authentication oauth-2.0 laravel-5

我想在我的控制下使用外部OAuth2服务器来验证Laravel 5.2应用程序的用户.作为客户端库,我想使用软件包league/oauth2-client据我所知,需要实现自定义用户提供程序,但我不确定所有必需步骤的大图.

这个想法是用户为我的Laravel应用程序提供凭据,换句话说client credentials就是使用该方法.然后,承载令牌和刷新令牌存储在客户端侧.每次客户端发出请求时,必须由OAuth服务器验证令牌.OAuth服务器还提供一些基本用户信息,如电子邮件和名称.因此,在我的应用程序中,本地用户和OAuth用户之间必须存在某种链接.这是通过一个简单的表来实现的

+-------------------+
|       Users       |
+-------------------+
| id      | int(10) |
| oauthId | int(10) |
+---------+---------+
Run Code Online (Sandbox Code Playgroud)

首先,我在laravel.io上按照本指南创建了一个基本的提供程序框架.但此时我有几个问题:

  1. 该方法retrieveById是应该从OAuth服务返回任何用户还是只允许请求发布者的用户看到?

  2. 我的OAuth服务器已经为每个用户进行了权限检查.如果retrieveById应该返回任何现有用户,我的权限检查OAuth服务器是否毫无价值?这将是我的架构中的一个缺陷.

  3. 某些方法必须返回\Illuminate\Contracts\Auth\Authenticatable接口的实现.我在哪里实现这个?这应该是试图验证的用户的表示吗?如果这应该代表我的模型中的用户,我遇到的问题是我不知道返回值,getAuthPassword因为此信息在我的OAuth服务器上.我怎么解决这个问题?

正如您所看到的,我在解决整个身份验证过程中如何协同工作方面遇到了问题.非常感谢您的帮助.

小智 2

这个想法是用户向我的 Laravel 应用程序提供凭据,换句话说,使用客户端凭据方法。

您应该使用授权码授予将用户转发到您的 oauth 服务器

所以

  1. 授权码授予将使用登录oauth服务器的用户。
  2. retrieveById您可以通过调用返回用户的权限
  3. 您可以为您不使用的功能添加一些虚假的填充内容。

这是我的例子,

我使用了自定义的Laravel/Socialite提供程序来帮助处理客户端路由等问题。应该league/oauth2-client是很相似的。

第一个登录重定向看起来像

class LoginController extends Controller
{ 
    public function login(Request $request)
    {
        return Socialite::driver('custom-oauth')
            ->scopes(['read-permissions read-name read-email etc'])
            ->redirect();
    }
}
Run Code Online (Sandbox Code Playgroud)

我将用户模型更改getAuthIdentifier()access_token从授权代码授予中返回。例如

class User implements Authenticatable
{
    public function getAuthIdentifier()
    {
        return $this->token;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的登录回调看起来像这样。

class LoginController extends Controller
{ 
    public function callback(Request $request)
    {
        /** @var \App\User $user */
        $user = Socialite::driver('custom-oauth')->user();

        Auth::login($user, true);

        return redirect()->home();
    }
}
Run Code Online (Sandbox Code Playgroud)

LaravelSessionGuard将存储该信息access_token,并且您的自定义用户提供程序应使用来获取用户信息retrieveById返回到 oauth 服务器access_token

然后我的自定义用户提供程序retrieveById看起来像。它基本上会访问 oauth 服务器并请求当前用户信息。$identifier=access_token

class CustomUserProvider implements UserProvider
{
    public function retrieveById($identifier)
    {
        try {
            return Socialite::driver('custom-oauth')->userFromToken($identifier);
        } catch (AuthenticationException $e) {
            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助