Discuz と UCenter の修正メモ
最近、プロジェクト構造の都合上、UCENTER に完全に集中することができず、ドッキングの過程で多くの不愉快な出来事に遭遇しました。多くの研究を行った結果、2 つの大きな問題が最終的に解決され、将来の参照のために記録されています。
プロジェクトではユーザーが登録時にメールアドレスを入力する必要はありませんが、UCENTER API では検証に合格するためにメールアドレスを入力する必要があります。最後の手段として、パスをバイパスするように UCENTER コードを変更する必要があります。変更されたコードは次のとおりです:
/uc_server/control/user.php 行 69:
<span style="color: #008080;">1</span> <span style="color: #008000;">//</span><span style="color: #008000;"> NOTE: 解决email必须填写的问题</span><span style="color: #008080;">2</span> <span style="color: #008000;">//if(($status = $this->_check_email($email)) < 0) {</span><span style="color: #008080;">3</span> <span style="color: #008000;">// return $status;</span><span style="color: #008080;">4</span> <span style="color: #008000;">//}</span>
掲示板は DISCUZ に伴う登録、ログイン、パスワード検索などの操作をブロックするため、シングルサインオンを実装する必要があります。非常に厄介な問題に遭遇しました。メイン サイトに登録されたアカウントが UCENTER に同期された後、UCENTER は他のアプリケーションに通知しません。つまり、デフォルトでは、他のアプリケーション (DISCUZ を含む) は新しいユーザー リストをすぐに登録できません。よく調べた結果、DISCUZ はローカル登録、ログイン、その他のイベント中にのみ UCENTER と同期することがわかりました。その結果、メイン サイトに新しく登録されたユーザーは、BBS にまったく存在しないため、シングル サインインを通じて正常に BBS にログインできません。解決策は 2 つあり、1 つはユーザーが一度 BBS に手動でログインし、BBS 独自のメカニズムにより UCENTER からのユーザー情報を自動的に同期する方法です。もう 1 つは、シングル サインイン時にユーザー データを自動的に同期するように DISCUZ システム コードを変更することです。リクエストに応じて作成されます。すべての要素を比較検討した結果、2 番目のオプションを採用することが決定されました。変更されたコードは次のとおりです:
/api/uc.php 192 行目:
<span style="color: #008080;"> 1</span> <span style="color: #008000;">//</span><span style="color: #008000;"> NOTE 解决用户必须手工登录1次论坛的问题</span><span style="color: #008080;"> 2</span> <span style="color: #800080;">$member</span> = getuserbyuid(<span style="color: #800080;">$uid</span>, 1<span style="color: #000000;">);</span><span style="color: #008080;"> 3</span> <span style="color: #008080;"> 4</span> <span style="color: #0000ff;">if</span> (!<span style="color: #800080;">$member</span><span style="color: #000000;">) {</span><span style="color: #008080;"> 5</span> <span style="color: #800080;">$init_arr</span> = <span style="color: #008080;">explode</span>(',', <span style="color: #800080;">$_G</span>['initcredits'<span style="color: #000000;">]);</span><span style="color: #008080;"> 6</span> <span style="color: #800080;">$groupid</span> = <span style="color: #800080;">$_G</span>['regverify'] ? 8 : <span style="color: #800080;">$_G</span>['newusergroupid'<span style="color: #000000;">];</span><span style="color: #008080;"> 7</span> <span style="color: #008080;"> 8</span> C::t('common_member')->insert(<span style="color: #800080;">$uid</span>, <span style="color: #800080;">$get</span>['username'], <span style="color: #008080;">md5</span>(random(10)), <span style="color: #800080;">$get</span>['email'], <span style="color: #800080;">$_G</span>['clientip'], <span style="color: #800080;">$groupid</span>, <span style="color: #800080;">$init_arr</span><span style="color: #000000;">);</span><span style="color: #008080;"> 9</span> <span style="color: #008080;">10</span> <span style="color: #800080;">$member</span> = getuserbyuid(<span style="color: #800080;">$uid</span>, 1<span style="color: #000000;">);</span><span style="color: #008080;">11</span> <span style="color: #000000;">}</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$member</span><span style="color: #000000;">) {</span><span style="color: #008080;">14</span> dsetcookie('auth', authcode("<span style="color: #800080;">$member</span>[password]\t<span style="color: #800080;">$member</span>[uid]", 'ENCODE'), <span style="color: #800080;">$cookietime</span><span style="color: #000000;">);</span><span style="color: #008080;">15</span> }</span>