Drupal 8外部/自定义身份验证提供程序

时间:2016-09-28 13:40:31

标签: php authentication drupal drupal-8

我正在尝试使用Drupal 8作为我们的客户网站。我们的客户通过我们自己的身份验证应用程序进行身份验证,该应用程序与我们的文档存储(而不是MySQL)通信,以对用户进行身份验证并为他们提供唯一的会话ID(JWT最终,但那是另一天和会话)我们然后可以用来查询REST API并在我们的任何其他自我应用程序中获取用户数据。

我们正在从一个旧的基于JSP的网站转移到drupal,因为我们的应用程序现在用Symfony 3编写,但希望我们的客户网站是Drupal 8。

这是我想要解决的问题。如果我在旧网站上进行身份验证,我希望能够使用我们手中的会话ID重定向到Drupal 8网站,并使用它来获取我们登录用户的对象。我有点工作正常,但我现在可以说...好的我有用户对象,第三方服务已经说会话ID有效所以我们知道我们已经过身份验证。

请参阅以下流程图。我希望能够手动在Drupal 8中进行身份验证。这是否可能(我确定是这样),如果是这样,有人可以指出我正确的方向,我需要/应该做什么,我应该打电话给API?

enter image description here

谢天谢地,美好的一天:)

2 个答案:

答案 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');
}