phpスクリプトでダイジェスト認証(Digest-Auth)を通過する方法を調べていたのですが、どうやらcurlライブラリを用いるしか方法が見当たりません。その他の方法があれば教えてください。
で本題のダイジェスト認証の通過ですが、ネットで調べて2件だけありました。
Perl Tips | PHP で、ダイジェスト認証(Digest Auth)をする HTTP クライアント
PHPでダイジェスト認証(curl) - ユーウツな雨がふりつづいても雪がハートを曇らせてもドアの中で待っていた君に魔法をかけたいのさ
とにかくまずは CURL が PHP で動けば、あとはプロトコルとして HTTP、HTTPS(SSL/TLS)、FTP、Telnet、LDAP プロトコルでアクセスするクライアントを作れるようだ。 CURL では HTTP だと、GET、POST、PUT、FTP アップロード、フォームからのアップロード、Proxy、cookie、ユーザ名とパスワードによる基本認証/ダイジェスト認証、HTTP(または HTTPS)の認証…と、フルサポートするようだ。
php:
-
$ch = curl_init();
-
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
-
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
-
curl_setopt($ch, CURLOPT_URL, $url);
-
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-
$str = curl_exec($ch);
-
curl_close($ch);
curlのいいところは、「HTTPS+ダイジェスト認証」みたいな際どいURLなんかにもアクセスできちゃうこと。しかも認証されていないhttpsにアクセスするためのオプションもちゃんとある。以下がそのオプション。
php:
-
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
-
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
これでやりたいことができるようになった!うーん・・・でも世の中的にはBasic認証の方が一般的ですよね。HTTPS+Digest-Authってレアかなぁ。。。
パソコン(個人向け)| Let'snote(レッツノート モバイルパソコン) | Panasonic
松下電器、ビジネスノート「Let'snote」新モデル発表会 | パソコン | マイコミジャーナル
松下、Let'snoteシリーズに14.1型ワイド液晶搭載の新モデル投入 | パソコン | マイコミジャーナル
2008年冬モデルで"8"シリーズになりましたね!
注目は、新シリーズCF-F8の登場。なんと!ダサい取っ手が付いてるwww そこまでするなら収納ポケットとか、つけちゃって、カバンいらずのLet's noteとかにしてくれYo!(ぉぃ
今回のモデルでYシリーズ以外はCentrino 2 プロセッサー・テクノロジー対応で、無線がIEEE 802.11 ドラフトnになってますね。そのうち省電力が進んでバッテリー駆動時間も伸びそうですね。あと、DDR3メモリに対応してくれればでさらに消費電力ダウンかな?
そういえば、CF-T8とCF-R8はメモリが最大3GBに増設可能だとか。ようやく3GBですか。CF-W8は最大4GBにしてくれればいいのに。
感想としては、やっぱり富士通のLOOX Rシリーズの2008年秋冬モデルが、1歩どころか、5歩くらいリードしてるかな。完全浮気しそうだゎw
文章を書いていた時に、たまたま「1と2と3と5と6」と言う文字列を順番どおりに書いて、入力切り替えのかったるさを実感しました。ふと考えてみると。「12356」を先に書いてから、あとから間に「と」を入れてくれるとスマートな気がして、でもphpでどうやって書くんだろうっていう、変な妄想にふけりました。
妄想の結果:
php:
-
$insert = 'と';
-
$str = '12356';
-
-
-
for ($i = 0; $i <$len; $i++) {
-
echo ($i> 0) ?
$insert .
$str[$i] :
$str[$i];
-
}
もう少し、スマートに書けるんじゃないかと思ったけど、これで満足・・・・と思いきや、$strがマルチバイトだと動かなそうな気がした。で、第2版がこちら
php:
-
$insert = 'to';
-
$str = 'あいうえお';
-
-
-
-
for ($i = 0; $i <$len; $i++) {
-
-
}
まーこれでいいかなぁー。自分の要望は満たしてるし。でもphpならもっとスマートにできる関数があると思うんだけどな。
symfony1.1で、メールアドレスとパスワードによるログインフォームを作りたい。

ログインフォーム
メンバー情報などが記録されたMemberテーブルは以下の仕様
TEXT:
-
propel:
-
member:
-
_attributes: { idMethod: native }
-
id: { type: INTEGER, required: true, autoIncrement: true, primaryKey: true }
-
name: { type: VARCHAR, size: '255', required: true, default: '' }
-
mail_pc: { type: VARCHAR, size: '255', required: true, default: '' }
-
password: { type: VARCHAR, size: '255', required: true, default: '' }
-
created_at: { type: TIMESTAMP }
-
updated_at: { type: TIMESTAMP }
-
last_logined_at: { type: TIMESTAMP }
-
is_admin: { type: TINYINT, default: '0' }
-
enabled: { type: TINYINT, required: true, default: '1' }
ログインフォームに必要なバリデータは、個々の項目(mail_pc、password)のバリデートと、データベースへの問い合わせの2つ。個々の項目のバリデートはバリデータを使えばすぐにできそう。以下のような感じ。
php:
-
class LoginForm extends sfForm
-
{
-
public function configure()
-
{
-
$this-
>setWidgets
(array(
-
'mail_pc' =
>
new sfWidgetFormInput
(array(),
array('size' =
>
50)),
-
'password' =
>
new sfWidgetFormInputPassword
(array(),
array('size' =
>
32)),
-
));
-
-
$this-
>widgetSchema-
>setLabels
(array(
-
'mail_pc' => 'PCメールアドレス',
-
'password' => 'パスワード',
-
));
-
-
$this->widgetSchema->setNameFormat('login[%s]');
-
-
$this-
>setValidators
(array(
-
'mail_pc' => new sfValidatorEmail(
-
-
-
'required' => 'メールアドレスを入力してください。',
-
'invalid' => 'メールアドレスが正しくありません。'
-
)
-
),
-
'password' => new sfValidatorString(
-
array('min_length' =
>
6,
'max_length' =
>
64),
-
-
'required' => 'パスワードを入力してください。',
-
'min_length' => 'パスワードは%min_length%文字以上です。',
-
'max_length' => 'パスワードは%max_length%文字以下です。',
-
)
-
)
-
));
-
}
-
-
}
エラー処理とかもバリデータが一括で請け負ってくれるので、データベースへの問い合わせもバリデータにすればすっきりすると思って、作ろうと思ったけど、ネット上に資料が少ない。どうやっていいかよくわからない。
とりあえず、複数項目のバリデートだから、validatorSchemaのsetPostValidator()に登録するんじゃないかと気づく。こんな感じでsfValidatorSchemaLoginクラスを作ってみた。
php:
-
/**
-
* sfValidatorSchemaLogin
-
*
-
* @package Travi
-
* @subpackage validator
-
*/
-
class sfValidatorSchemaLogin extends sfValidatorBase
-
{
-
/**
-
* @see sfValidatorBase
-
*/
-
protected function doClean($values)
-
{
-
if ($values['mail_pc'] != '' && $values['password'] != '') {
-
// 両パラメータが与えられたときだけ実行
-
$encrypted_password = myUtil::encrypt($values['password']);
-
if (MemberPeer::isValidUser($values['mail_pc'], $encrypted_password)) {
-
return $values;
-
} else {
-
throw
new sfValidatorError
($this,
'invalid',
array());
-
}
-
}
-
return $values;
-
}
-
}
このクラスのミソは、必要なパラメータ(メールアドレスとパスワード)がそろったときだけ、データベースに問い合わせること。なぜかというと、メールアドレスかパスワードのバリデータが成功した時点でデータベースの問い合わせをした方が効率がいいので。
最後に、LoginFormのPostValidatorを登録
php:
-
$this->validatorSchema->setPostValidator(
-
new sfValidatorSchemaLogin(
-
-
-
'invalid' => 'メールアドレスかパスワードが間違っています。'
-
)
-
)
-
);
意外と簡単にいけたけど、もっとスマートな方法ないかなぁ。。。Propel系の標準Validatorがいまいちよくわからないんだな。
(関連記事:[symfony]Class ‘BaseFormPropel’ not foundエラー解決)
symfony 1.1系列が出てるので、sandboxを拡張してsfFormの練習がてらアプリを作っているのですが、symfony 1.1.1や1.1.2で、以下のようなエラーが出ました。
php:
-
[?php /** * Project form base class. * * @package form * @version SVN: $Id: sfPropelFormBaseTemplate.php 6174 2007-11-27 06:22:40Z fabien $ */
-
abstract class BaseFormPropel extends sfFormPropel { public function setup() { } }
-
Fatal error: Class 'BaseFormPropel' not found in /path/to/symfony/lib/form/base/BaseMemberForm.class.php on line 10
状況的には、symfonyコマンドのpropel:build-formsで作成したフォームを使おうとすると、BaseFormPropelクラスがないって言って、上のようなエラー画面になってしまう。
不自然なのは、phpタグが大括弧で始まっていること。
プロジェクト内を検索してみたら、
TEXT:
-
/lib/symfony/plugins/sfPropelPlugin/data/generator/sfPropelForm/default/template/sfPropelFormBaseTemplate.php
に確かに大括弧で始まる同じデータがあった。
なんでこのファイルをロードするんだろう。。。
解決策1
とりあえず、自分のやる気をそがれるのが嫌だから、暫定措置として、/lib/form/base/BaseXXXXForm.class.phpのextendsしているクラスをBaseFormPropelからsfFormPropelに変更。簡単に言うと、BaseFormPropelっていう中間のクラスを抜いただけ。とりあえず、それほど大きいアプリじゃないから、このままでいいや。
解決策2
思いつきで、クラス名とファイル名を変えてあげればいいかなっと思って、/lib/form/base/BaseXXXXForm.class.phpのextendsしているクラスをBaseFormPropelからBaseFormPropel2に変更。/lib/form/BaseFormPropel.class.phpをBaseFormPropel2.class.phpに変更。そのファイルの中身をBaseFormPropelからBaseFormPropel2に変更。どうやらこれでもうまくいきました。なんていうか。。。微妙な解決策w
ネットで探したら、同じエラーの人がいた。symfony framework forum: Installation and setup => "Fatal error: Class 'BaseFormPropel' not found"でも、起きている状況が違うような気もするな。あと、英語よくわからない。
根本的な原因がわからないのが、ちょっと後味悪いかな。
続き:[symfony]Class ‘BaseFormPropel’ not foundエラー解決