2016-09-28 36 views
3

私は、Drupal 8をお客様のWebサイトとして試しています。私たちの顧客は、MySQLの代わりに私たちのドキュメントストアに話をして、ユーザーを認証し、ユニークなセッションID(最終的にはJWTですが、これは別の日と会話です)を提供するために、 REST APIを照会し、他のセルフアプリでユーザーデータを取得します。Drupal 8外部/カスタム認証プロバイダ

我々は我々のアプリは、現在のSymfony 3に書かれているようDrupalのために古いJSPベースのWebサイトから上を移動しますが、お客様のウェブサイトは、Drupalの8

ようにしたいされているここで私が動作するようにしようとしているビットです。私が以前のウェブサイトで認証した場合、私たちが持っているセッションIDを持つDrupal 8のWebサイトにリダイレクトし、ログインしたユーザーのオブジェクトを取得するために使用したいと思っています。私はこのビットがうまく動作しているが、今私は言うことができる位置にいる...私はユーザーオブジェクトを持っている、サードパーティのサービスはセッションIDが有効であると言っているので、我々は認証されていることを知っている。

以下のフローチャートを参照してください。私もDrupal 8で手動で認証できるようにしたい。これは可能ですか(私は確信していますか?)もしそうなら、誰かが私が必要としている/しなければならないことについて正しい方向で私を指し示すことができますか?

enter image description here

それが最終的にそのトリッキーなことがないように判明して[OK]を:)

答えて

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'); 
} 
+1

です。これに対して外部認証を使用しましたか? 'インバウンド'はどこに住んでいますか? – Kevin

+1

UserAuthInterfaceを実装している独自のクラスを実装している場合、ユーザがログインにCore Drupalログインフォームを使用させる場合は、直接 'user_login_finalize'を呼び出す必要はありません。これはあなたのために起こります。それ以外の場合は、URLまたはクッキー内のセッションIDを、ログインフォームに行くことなく探している場合は、その呼び出しを行う必要があります。 – Kevin

3

External Authモジュールを使用する必要があります。

このモジュールを使用する方法の良いexempleは下線の機能は、手続きの機能と長い時間前に記載コーディング標準装備されていSimpleSamlPHP Auth

関連する問題