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 いれると普通にプラグインの単体テストっぽいことができる。

广告
将在 10 秒后关闭
bannerAds