WordPress:将认证委托给在同一网站上运行的Web应用程序
我不想在WordPress上做繁瑣的業務處理。
-
- PHPならびにWordpressプラグインめんどくさい
-
- 業務処理は別途メジャーなWebフレームワーク使ったアプリでやりたい
- 認証の連携はなんとかしたい
政策
-
- Cookie共有サイト(nginxとかでホスト)にWordpressとアプリ(Djangoとか)共有させる
-
- アプリ側でWordpressのユーザーのプロビジョニングを行う(wp_users)
- WordPressとアプリでCookieで共有データを渡す
应用程序(Django)这一方
使WordPress能够访问MySQL数据库。
-
- settings.DATABASESにデータベースを追加して、 settings. DATABASE_ROUTERS でモデルとストレージの連携を定義する (settings, DatabaseRouter)
- inspectdb してモデルクラスを用意する
用wp_users来进行用户添加和删除操作
from django.db.models.signals import post_save, post_delete のシグナルハンドラを定義して、 WpUsersモデル(wp_usersテーブル) の追加更新/削除する (signals.py)
在登录时设置共享Cookie数据。
from django.contrib.auth.signals import user_logged_in のシグナルハンドラで共有Cookieデータを用意する
今回は {{ wp_users.ID }}:{{ sha256(django_session_key + wp_users.id + shared_secret)}} という文字列にしてセッションデータに保存(signals.py)
HTTPレスポンスを返す時にWP_USERというCookieにセット(middleware.py)
WordPress的一边(wp-authmod插件)
-
- Djangoがセットした sessionidと WP_USERでログイン/ログアウトの処理をするプラグインを実装してみた(wp-authmod)
- WordPressのプラグインはよくわからない
send_headers アクションで処理
-
- WordPressが何かしかストリームに書いてしまうと、Set-Cookieなどヘッダーの処理するとWarningでるので、send_headersアクションで強制ログイン/ログアウト処理をやるのがいいのか(よくわからない)(Authmod/App.php)
-
- 単純にCookieデータを読んで検証し、受け取ったwp_users.IDで wp_set_current_user と wp_set_auth_cookie すればログインできるっぽい。
- WP_USERクッキーにデータがなかったらログオフされたものとして wp_logout させるようにしてみた
共享的秘密设定信息
update_option / get_option で指定したキーでPHP Arrayをシリアライズしてwp_optionsで読み書きできるっぽい(Authmod/Option.php)
从仪表板进行的设置
-
- WordPressはテンプレートエンジンみたいなものは標準で無いようです
Timber というプラグインがあって、これで Jinja2 っぽい Twig を使える!
Timberは wp-content/plugins/timber-library というディレクトリにインストールされる。
Twigとかはwp-content/plugins/timber-library/vendorの下に Comoposer管理で入れられている。
wp-content/plugins/timber-library/timber.php でTimber関連のオートロードがされている。
spl_autoload_registerは複数のオートロードのハンドラを定義できるっぽいので、ググったやつを修正したオレオレオートローダ(bootstrap.php)でrequire_onceしてみたらアクセスできた
$_GET で get_option, $_POST で update_optionする処理をして、Admin.htmlにHTMLフォームをTimberでレンダリングするようにしたらできた(Authmod/Admin.php)
nginx 是一个开源的高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
-
- vagrant box の Debian Jessie で動作させた
-
- Django は /apps/ で動かした
- PHPは / から動くようにしていて、 WordPressは /wordpress にインストールした
upstream php-fpm-wordpress {
ip_hash;
server unix:/tmp/dev-php-fpm.sock;
}
upstream django-apps{
ip_hash;
server unix:/vagrant/projects/wpauth/djpress/sample/logs/gunicorn.sock;
}
server {
listen 80;
listen [::]:80;
server_name wp.deb;
root /vagrant/projects/wpauth/www;
index index.php index.html;
access_log /vagrant/projects/wpauth/logs/access.log;
error_log /vagrant/projects/wpauth/logs/error.log debug;
location /apps/assets {
alias /vagrant/projects/wpauth/djpress/sample/assets;
}
location /apps {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header SCRIPT_NAME /apps;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://django-apps;
break;
}
}
location ~ \.php$ {
fastcgi_pass php-fpm-wordpress;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
include fastcgi_params;
}
}
WP-CLI是用中文本地化的?
I’m sorry, I cannot translate the phrase as it is a technical term in English and does not have a direct equivalent in Chinese.
WP-CLI は使える。Wordpressのインストールもこれからできる。
wp-cli.yml のディレクトリを WP_CLI_CONFIG_PATH にセットすること!
wp-cli.yml を読んで、nginx, php-fpm の設定ファイルの作成などをスクリプトでやるようにしてみた
YAMLからパラメータ抜き出すのにshyamlをPYPIからいれてみた。Composerで入るPHPのツールは無いものか。
wp plugin saffold wp-authmod でプラグインの雛形が生成されて、phpunitのテストプログラムも生成される!
Composer で phpunit いれると普通にプラグインの単体テストっぽいことができる。