我想在我的控制下使用外部OAuth2服务器来验证Laravel 5.2应用程序的用户。作为客户端库,我想使用包x
据我所知,需要实现自定义用户提供程序,但我不确定所有必需步骤的大图。
这个想法是用户向我的Laravel应用程序提供凭据,换句话说,使用了league/oauth2-client
方法。然后,承载令牌和刷新令牌存储在客户端侧。每次客户端发出请求时,必须由OAuth服务器验证令牌。 OAuth服务器还提供一些基本用户信息,如电子邮件和名称。因此,在我的应用程序中,本地用户和OAuth用户之间必须存在某种链接。这是通过像
client credentials
首先,我按照this guide at laravel.io创建了一个基本的提供程序框架。但此时我有几个问题:
方法+-------------------+
| Users |
+-------------------+
| id | int(10) |
| oauthId | int(10) |
+---------+---------+
是否应该从OAuth服务返回任何用户,或者只允许作为请求发布者的用户返回?
我的OAuth服务器已经对每个用户进行了权限检查。如果retrieveById
应该返回任何现有用户,我的权限检查OAuth服务器是否毫无价值?这将是我的架构中的一个缺陷。
某些方法必须返回retrieveById
接口的实现。我在哪里实现这个?这应该是试图验证的用户的表示吗?如果这应该代表我的模型中的用户,我遇到的问题是我不知道\Illuminate\Contracts\Auth\Authenticatable
的返回值,因为此信息位于我的OAuth服务器上。我该如何解决这个问题?
正如您所看到的,我在解决整个身份验证过程中如何协同工作方面遇到了问题。非常感谢您的帮助。
答案 0 :(得分:2)
将用户转发到您的oauth服务器这个想法是用户为我的Laravel应用程序提供凭据,换句话说就是使用了客户端凭证方法。
所以
retrieveById
调用我使用自定义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
我希望有帮助