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

时间:2016-02-23 10:40:11

标签: php authentication laravel-5 oauth-2.0

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

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

这样的简单表格完成的
client credentials

首先,我按照this guide at laravel.io创建了一个基本的提供程序框架。但此时我有几个问题:

  1. 方法+-------------------+ | Users | +-------------------+ | id | int(10) | | oauthId | int(10) | +---------+---------+ 是否应该从OAuth服务返回任何用户,或者只允许作为请求发布者的用户返回?

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

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

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

1 个答案:

答案 0 :(得分:2)

  

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

您应该使用authorization code grant

将用户转发到您的oauth服务器

所以

  1. 授权代码授予将使用在oauth服务器上登录的用户。
  2. 您可以使用retrieveById调用
  3. 返回用户的权限
  4. 你可以为你不能使用的功能填写一些虚假内容。
  5. 以下是我的例子,

    我使用自定义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();
        }
    }
    

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

    class User implements Authenticatable
    {
        public function getAuthIdentifier()
        {
            return $this->token;
        }
    }
    

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

    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();
        }
    }
    

    Laravel的SessionGuard会将access_token和您的自定义用户提供商[{1}}存储回oauth服务器,使用retrieveById获取用户信息< / p>

    然后我的自定义用户提供商access_token看起来像。这基本上击中了oauth服务器并请求当前用户信息。 retrieveById = $identifier

    access_token

    我希望有帮助