シングル サインオン Ucenter 原理分析
1. ユーザーは discuz にログインし、logging.php ファイルの uc_user_login 関数を通じて投稿されたデータを検証します。つまり、ユーザー名とパスワードを検証します。
2. 検証が成功すると、uc_client の下の client.php ファイルにある関数 uc_user_synlogin が呼び出されます。この関数では、uc_api_post('user', 'synlogin', array('uid'=>$uid)) が呼び出されます。呼ばれます。
3. 次に、この関数は Ucenter の Index.php にデータを渡します。Index.php は渡されたデータを受け取り、モデルの値を user として、action を synlogin として取得します。
4. 次に、Ucenter のindex.php は、制御ディレクトリの user.php クラスの onsynlogin メソッドを呼び出し、JavaScript を使用して、foreach ループを介して同期ログインを有効にする uc アプリケーション リスト内のアプリケーションに同期ログインを通知します。それを各アプリケーションディレクトリのapi配下のuc.phpの一部のデータに渡します。
5. uc.php は通知を受信し、取得したデータを処理し、関数 synlogin (uc.php にあります) 内の関数 _authcode を使用してデータを暗号化し (デフォルトではキーとして UC_KEY を使用します)、関数 _setcookie で Cookie を設定します。
6. 各アプリケーションは、対応するキーを使用して上記の Cookie セットをデコードし、ユーザー ID およびその他のデータを取得します。この値を使用して、ユーザーが他のアプリケーションを通じてログインしたかどうかを判断し、ユーザーが自動的にログインできるようにします。
アプリケーション内のlogging.php ------>client.php in uc_client------>Ucenter------>アプリケーション内のapi/uc.php
実際、同期ログインを実現するための Ucenter の原理は、アプリケーションがログインに成功すると、データを Ucenter に転送し、Ucenter が他のアプリケーションにも Cookie を設定するように通知します。他のアプリケーションにアクセスするときに設定されています。 Ucenter の同期原理を理解すると、同期ログインで問題が発生したり、UCenter とのインターフェイスを開発したりすることがはるかに簡単になります。
一般的な手順: まず、ucenter をインストールし、次に uc_client フォルダーを独自のプロジェクトにコピーして、いくつかのファイルを構成する必要があります
client.php は関数ライブラリに相当します
uc.php はコールバック ファイルと同等です
設定ファイルである config.inc.php もあります
ログインを同期するように 2 つのアプリケーションを設定している場合、アプリケーションにログインするときに
を実行します。
include './config.inc.php'; include './uc_client/client.php'; $usernames="feiye"; $passwords="789123"; list($uid, $username, $password, $email) = uc_user_login($usernames, $passwords); if($uid > 0) { setcookie("username",$username,time()+intval(24*3600)); echo uc_user_synlogin($uid); echo '登录成功'; } elseif($uid == -1) { echo '用户不存在,或者被删除'; } elseif($uid == -2) { echo '密码错'; } else { echo '未定义'; }
uc_user_synlogin() この関数は、同期ログインを有効にする他のすべての関数への同期ログインを表します。uc 自体は、バックグラウンドで同期ログインを有効にするすべてのアプリケーションをループし、それをページに出力します
<script type="text/javascript" src="http://127.0.0.70/api/uc.php?time=1374540644&;code=14fdIufn%2B2YwkQlN9P07FEHOfZvDJupvgBgaRPn7R0DJmbEwCb23vKwO1uaeybLq3HZhtokoZrnqu7NGi09jzs684drFCbLDiSpKhk6P50MftBRA3vp4yIswhrPMl1dXo5ajB7CVZ9F8EI%2BkdFfq0E0rdyeRkuz8goeHhg" reload="1"></script> <script type="text/javascript" src="http://127.0.0.71/api/uc.php?time=1374540644&;code=07a91g8SepQwwfA3C1uN1sPhC4v6yuER1jFbVTQMK%2BQZmTkjwOz8X%2B8rWgNmKdhlXe9XXVQqAkDjN26CK6BMA19ZpLoiSW4wuNnxHAB9xXLt2VExuyf03MnEHAC%2BUdjwb58sbXGcYUpM4Bmzdm3Q92ObSp0Kk2qCd12fqg" reload="1"></script>
このような JS コードが同期ログインを可能にする各アプリケーションに送信され、同期ログインを可能にする各アプリケーションのコールバック ファイル uc.php が受信された後に復号化され、実際に自分でコードを書くことができます。この uc.php コールバック ファイルのコードは、その形式で記述する必要はありません。たとえば、セッション
に基づいて同期ログインを行うこともできます。
function synlogin($get, $post) { $uid = $get['uid']; $username = $get['username']; if(!API_SYNLOGIN) { return API_RETURN_FORBIDDEN; } header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); setcookie('gwyy',$username,time()+3600,'/','127.0.0.71'); _setcookie('Example_auth', _authcode($uid."\t".$username, 'ENCODE')); $_SESSION['username'] = $username; $_SESSION['uid'] = $uid; } function synlogout($get, $post) { if(!API_SYNLOGOUT) { return API_RETURN_FORBIDDEN; } //note 同步登出 API 接口 header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); _setcookie('Example_auth', '', -86400 * 365); unset($_SESSION['username']); unset($_SESSION['uid']); session_destroy(); }
このようにして、ユーザーが他のアプリケーション ページを更新すると、自動的にログインします
UC にアプリケーションを追加すると、通信が成功しないというメッセージが表示される場合、その理由は非常に単純で、http://xxxx/api/uc.php ファイルが見つからないことです。このファイルが存在するので、通信は間違いなく成功します
実際、UC の原理は非常に単純です。アプリケーションはログイン後、バックグラウンドで同期的にログインしているアプリケーションに送信されたコールバック ファイルをポーリングし、コールバック ファイルがユーザー ID を生成します。 Cookie またはセッションを取得し、ログイン モードに入ります。