web-dev-qa-db-ja.com

外部の「ディレクトリサービス」とのSSO /認証統合

私はクライアントのためのプロトタイプの作業を始めようとしています - そして必要な機能の1つは社内のユーザー認証/登録システムとの統合です。

このシステムは信頼できるユーザーデータベースとして機能し、新しいユーザーを作成し、有効なユーザーを認証するためのRESTfulインターフェイスを提供します。

  1. WPに新しいユーザーを作成し、そのプロセスの一部として外部認証APIを呼び出して、そのユーザーを作成または検証する必要があります。

  2. 有効なユーザーであるがWPを知られていない人は、WPサイトに自分で登録する必要なしに、コメントにログインすることができるはずです。

  3. Webサイト全体にログインした人も自動的にWordPressにログインするはずです。

私は次のような方法があると考えています。

  • (1) - 使用できる登録フックはありますか?

  • (2) - 私は認証フィルタをフックすると仮定しています - つまり、誰かがログインしようとしたとき、それをトラップし、外部システムへの呼び出しを行い、そしてWP loginを処理するかリダイレクトします(1)を採用する登録プロセスへ。

  • (3)の場合 - メインサイトが設定したログインクッキーを読み、(2)に進みますか。

私はusersとusermetaテーブルにレコードを挿入する必要もあると思います。

だから、上記は理にかなっている - 私は何かについて考えていないか。誰もがこれを手助けするための良いリソースを手に入れました(@hakre - 私はあなたがこれについていくつかの仕事をしたのを見ました!!)。

更新

それで私はまだこれに少し頭をぶつけています、本質的に私は認証フィルタにフックしようとしていて、それを使うためにそれを使っています:

  1. 'マスター'サイトのログインクッキーが設定されているか確認し、設定されている場合は認証APIに対して再検証し、有効な場合はマスターサイトに含まれる情報を使用してwp_signon()でWPログインを強制します。 WPの認証情報としてのクッキー(Eメールとハッシュされたパスワード)
  2. cookieが設定されていない場合は、マスターサイトのログインページにリダイレクトし、ログイン/サインアップのいずれかを取得してから手順1に戻ります。
  3. 認証されたマスターサイトユーザーが存在するときにWPユーザーがいない場合は、それを作成してから「透過的」サインオンを行います(つまり、ユーザーにはWPログインが表示されません)。形)

基本的に、私はWPログインフォームを、主にコメントしたいユーザーのために完全に隠し、後で作者と管理者がそれに直接アクセスできるようにする方法を見つけたいと思います。

それはかなりゆっくり進行しています、ここで私はいくつかの助けを借りて使うことができるものです:

  • 認証フィルターは正しい使用フィルターですか?それは私が期待するすべての状況で呼び出されるようには思えません - 例えばmetaウィジェットは認証フックの起動なしでログイン/ログアウトリンクを表示します

  • wp_signon()WP_Userオブジェクト(成功を示す)を返させることはできますが、ログイン状態には影響しません。つまり、更新後もメタウィジェットは「Login」で表示されたままになります。

どんな助けでもありがたく受けました:)

15
anu

さて、私のために働いているアプローチは以下の通りです:

  1. メインサイトのユーザーデータベースに権限があるとします。メインサイトのログインCookieには、IDとサイトパスワードのハッシュが含まれています。

  2. メインサイトからクッキーを取得し、メインサイトの認証APIに対してそれを再検証します

  3. 有効な場合、戻り値からの電子メールアドレスをWPの'user_login'値として使用し、ハッシュされたサイトパスワードをWPパスワードとして使用します。

  4. wp_authenticate('user_login', 'user_pass')を使用して、このユーザーがWPに存在するかどうかをテストします。成功した場合はWP_Userオブジェクト、失敗した場合はWP_Errorオブジェクトを返します。

  5. WP_Error/is_wp_error()の場合は、use wp_update_user()を使用してユーザーを作成します(またはパスワードを変更してユーザーを更新します)。

  6. wp_set_current_user()wp_set_auth_cookie()およびdo_action('wp_login, id)を介してログイン

(これはすべて'init'アクションに付随する関数に含まれています)

これはうまくいっているようです - WPがわからない有効なサイトユーザーが自動的に作成されます。パスワードの変更は考慮され、サイトクッキーが設定されていて、WPユーザーが存在する場合、SSOは自動的に行われ、非常にシームレスです。

12
anu

認証システム全体がプラグ可能です。既存のプラグインを調べてシステムをオーバーライドする方法を理解することをお勧めします。おそらく、いくつかの LDAPプラグインを見ることで

3
Dougal Campbell

WordPressでシングルサインオンを有効にするには18時間以上かかりましたが、数分しかかかりませんでした:

基本的には、 https://wordpress.org/plugins/wp-force-login/https://as.wordpress.org/plugins/jwt-authenticatorの修正版を使用することをお勧めします。/ それからJWT(JSON Web Token)を生成し、あなたのWordPressサイトの特別なURLにリダイレクトするあなたのメインサイト上の認証保護されたエンドポイントを作成します。

こちらの full codeを参照してください

1
Ryan

いくつかのユーザ関連関数はwp-includes/pluggable.php内の!function_exists()で条件付きで定義されており、あなた自身のバージョンで上書きするのは簡単です。

1
Rarst