【问题标题】:Drupal 8 external/custom authentication providerDrupal 8 外部/自定义身份验证提供程序
【发布时间】:2016-09-28 13:40:30
【问题描述】:

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

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

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

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

谢谢你的好意和美好的一天:)

【问题讨论】:

    标签: php authentication drupal drupal-8


    【解决方案1】:

    您应该使用External Auth 模块。

    如何使用这个模块的一个很好的例子是SimpleSamlPHP Auth

    【讨论】:

      【解决方案2】:

      好的,所以最终结果并没有那么棘手。我以为我必须扩展和实现各种类并创建自己的提供程序(这可能是最佳实践),但为了 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');
      }
      

      【讨论】:

      • 下划线的函数是过程函数,是很久以前提出的编码标准。您为此使用了外部身份验证吗? inbound 住在哪里?
      • 只是想在我自己做完之后在这里跟进 - 如果您实现自己的实现 UserAuthInterface 的类,如果您让用户使用核心 Drupal 登录表单,则无需直接调用 user_login_finalize登录。这会发生在你身上。否则,如果您在 URL 或 cookie 中查找会话 ID,而不使用登录表单,那么是的,您需要进行该调用。
      • 我有兴趣尝试这个解决方案,但我想到了与 Kevin 相同的问题:外部身份验证是否用于此?这段代码到底在哪里?也许在自定义模块中?当前要扩展的类名应该是什么。任何额外的细节都非常感谢。我想从一个自定义模块开始,但如果您的解决方案是其他选项,我会很好地尝试这种方式。提前致谢。我习惯使用 Guzzle 库,看起来是一种有趣的解决方法。只需要更多的上下文:)
      猜你喜欢
      • 2012-04-05
      • 1970-01-01
      • 2017-05-12
      • 2012-11-09
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      相关资源
      最近更新 更多