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上按照本指南创建了一个基本的提供程序框架.但此时我有几个问题:
该方法retrieveById是应该从OAuth服务返回任何用户还是只允许请求发布者的用户看到?
我的OAuth服务器已经为每个用户进行了权限检查.如果retrieveById应该返回任何现有用户,我的权限检查OAuth服务器是否毫无价值?这将是我的架构中的一个缺陷.
某些方法必须返回\Illuminate\Contracts\Auth\Authenticatable接口的实现.我在哪里实现这个?这应该是试图验证的用户的表示吗?如果这应该代表我的模型中的用户,我遇到的问题是我不知道返回值,getAuthPassword因为此信息在我的OAuth服务器上.我怎么解决这个问题?
正如您所看到的,我在解决整个身份验证过程中如何协同工作方面遇到了问题.非常感谢您的帮助.
小智 2
这个想法是用户向我的 Laravel 应用程序提供凭据,换句话说,使用客户端凭据方法。
您应该使用授权码授予将用户转发到您的 oauth 服务器
所以
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();
}
}
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)
我希望这有帮助
| 归档时间: |
|
| 查看次数: |
1344 次 |
| 最近记录: |