我正在尝试使用Drupal 8作为我们的客户网站。我们的客户通过我们自己的身份验证应用程序进行身份验证,该应用程序与我们的文档存储(而不是MySQL)通信,以对用户进行身份验证并为他们提供唯一的会话ID(JWT最终,但那是另一天和会话)我们然后可以用来查询REST API并在我们的任何其他自我应用程序中获取用户数据。
我们正在从一个旧的基于JSP的网站转移到drupal,因为我们的应用程序现在用Symfony 3编写,但希望我们的客户网站是Drupal 8。
这是我想要解决的问题。如果我在旧网站上进行身份验证,我希望能够使用我们手中的会话ID重定向到Drupal 8网站,并使用它来获取我们登录用户的对象。我有点工作正常,但我现在可以说...好的我有用户对象,第三方服务已经说会话ID有效所以我们知道我们已经过身份验证。
请参阅以下流程图。我希望能够手动在Drupal 8中进行身份验证。这是否可能(我确定是这样),如果是这样,有人可以指出我正确的方向,我需要/应该做什么,我应该打电话给API?
谢天谢地,美好的一天:)
答案 0 :(得分:4)
您应该使用External Auth模块。
使用此模块的一个很好的例子是SimpleSamlPHP Auth
答案 1 :(得分:1)
好吧事实证明最终并不是那么棘手。我以为我必须扩展和实现各种类并创建我自己的提供者(这可能是最佳实践)但是为了KISS的缘故,我找到了另一种方法。
如果根据我从外部服务返回的用户数据不存在,则首先创建用户。然后将创建的用户传递给user_login_finalize
方法(为什么很多方法都强调了Drupal ...),然后对我的用户进行了身份验证。
public function inbound(Request $request)
{
// Point the guzzle client to our external session service.
$client = new GuzzleHttpClient([
'base_uri' => 'https://myexternalservice.com/apps/authentication/2/',
]);
// Attempt to send to request with the session ID from the parameters.
try {
$response = $client->request('GET', 'api/v1/user/' . $request->get('session_id'));
} catch (\Exception $e) {
throw new \HttpException($e->getMessage());
}
// Convert the response to an array.
$result = json_decode((string) $response->getBody(), true);
// Convert our array to a user entity.
if ($user = $this->convertResponseToUser($result['user'])) {
try {
// Attempt to load the user. If the user does not exist then create them first.
if (!$assumeUser = user_load_by_mail($user->getEmail())) {
// Create a Drupal user object.
$assumeUser = $this->createUser([
'name' => $user->getFirstName() . ' ' . $user->getLastName(),
'mail' => $user->getEmail()
]);
$assumeUser->save();
}
// Authenticate the user.
user_login_finalize($assumeUser);
} catch (\Exception $e) {
drupal_set_message(t('An unhandled exception occurred during authentication.'), 'error');
return $this->redirect('user.login');
}
}
return $this->redirect('mymodule.route');
}