blogpetの認証を無理に通そうとしてみた
前回の記事から数ヶ月経ってますがblogpetのXML-RPCについて色々してみた記録。
結論から言うと今回も駄目でした。
まず、投稿用APIの設定での最初の認証では、3種類の認証方法を試しているらしいので(前回の記事のLanタソさんのコメントから)、とりあえずcgiへのアクセスを全部取ってみた。
すると何故か作成されるファイルが2つしかない。
どっちもヘッダにHTTP_X_WSSEがあった事から、この2つはATOM APIへのWSSE認証だと思われる。
ではXML-RPCへの認証は何処行ったのか?
…わかりませんorz
で、とりあえずその両方のWSSEヘッダをアルゴリズムに通したところ、やっぱりどっちもPasswordDigestが一致しなかった。何故?
なら、認証が通ってる場所がどんなレスポンスしてるのか調べようとしてみた。
とりあえずFC2のAPIはちゃんと設定したら通った。
と言う訳で、適当にCGI組んでHTTP通信でX_WSSEのヘッダを投げてみた。
…何も起こらなかったorz
どうやらXML-RPCなので、正しいレスポンスを得るには別の手段が必要らしい。
ちなみに、FC2のエンドポイントURLはhttp://blog.fc2.com/xmlrpc.php
あと、perlでのHTTP通信を今までやった事がなく、組んだCGIがあまりにお粗末な代物だったので、XML-RPCに投げるべきXMLを上手く送れなかった。
その為、未だにXML-RPCの正しいリクエストとレスポンスのフォーマットがいまいちわからなかった。
そんな訳でXML-RPCについて色々と調べてみた。
XML-RPCは、ブログシステムのエンドポイントURLに向かってメソッド、ユーザID、パスワード、その他メソッドごとに必要なパラメータを投げる事によって、対象のブログから情報を得たり、記事を追加したりする事が出来る。
また、それぞれのパラメータはXMLで整形したものを渡さなければならない。
詳しくはこちら。
XML-RPC仕様書
でも、ブログペットのオーナーページで設定したAPIに向かってXML投げてる形跡がない。
と言うか最初からXML投げてくれてればここまで四苦八苦してない…。
ここまで数時間やって色々と尽き果てかけてた自分は何を思ったか、適当なメソッドのレスポンス例を直接叩きつけるとか言うアホな行動に出た。
Lanタソさんのコメントで"記事取得のAPIを叩いている"と言うのを根拠に、
・metaWeblog.getRecentPosts
・metaWeblog.getPost
のレスポンス例を適当に叩きつけてみた。
まぁ結果は予想通り何も変化無しだった訳ですが。
この辺りで力尽きたらしいので、今回はここで終了。
もうちょっとHTTP通信の勉強してからまたやります…。
・参考文献
MetaWeblog APIのXMLデータ
MetaWeblogAPI関連
FC2ブログのエンドポイント
Movable Type で使える XML-RPC API
MovableTypeを制覇する
JavaScript WSSE Header Generator
PerlでHTTP通信
LWPモジュール v5.48
HTTPのステータスコード
結論から言うと今回も駄目でした。
まず、投稿用APIの設定での最初の認証では、3種類の認証方法を試しているらしいので(前回の記事のLanタソさんのコメントから)、とりあえずcgiへのアクセスを全部取ってみた。
すると何故か作成されるファイルが2つしかない。
どっちもヘッダにHTTP_X_WSSEがあった事から、この2つはATOM APIへのWSSE認証だと思われる。
ではXML-RPCへの認証は何処行ったのか?
…わかりませんorz
で、とりあえずその両方のWSSEヘッダをアルゴリズムに通したところ、やっぱりどっちもPasswordDigestが一致しなかった。何故?
なら、認証が通ってる場所がどんなレスポンスしてるのか調べようとしてみた。
とりあえずFC2のAPIはちゃんと設定したら通った。
と言う訳で、適当にCGI組んでHTTP通信でX_WSSEのヘッダを投げてみた。
…何も起こらなかったorz
どうやらXML-RPCなので、正しいレスポンスを得るには別の手段が必要らしい。
ちなみに、FC2のエンドポイントURLはhttp://blog.fc2.com/xmlrpc.php
あと、perlでのHTTP通信を今までやった事がなく、組んだCGIがあまりにお粗末な代物だったので、XML-RPCに投げるべきXMLを上手く送れなかった。
その為、未だにXML-RPCの正しいリクエストとレスポンスのフォーマットがいまいちわからなかった。
そんな訳でXML-RPCについて色々と調べてみた。
XML-RPCは、ブログシステムのエンドポイントURLに向かってメソッド、ユーザID、パスワード、その他メソッドごとに必要なパラメータを投げる事によって、対象のブログから情報を得たり、記事を追加したりする事が出来る。
また、それぞれのパラメータはXMLで整形したものを渡さなければならない。
詳しくはこちら。
XML-RPC仕様書
でも、ブログペットのオーナーページで設定したAPIに向かってXML投げてる形跡がない。
と言うか最初からXML投げてくれてればここまで四苦八苦してない…。
ここまで数時間やって色々と尽き果てかけてた自分は何を思ったか、適当なメソッドのレスポンス例を直接叩きつけるとか言うアホな行動に出た。
Lanタソさんのコメントで"記事取得のAPIを叩いている"と言うのを根拠に、
・metaWeblog.getRecentPosts
・metaWeblog.getPost
のレスポンス例を適当に叩きつけてみた。
まぁ結果は予想通り何も変化無しだった訳ですが。
この辺りで力尽きたらしいので、今回はここで終了。
もうちょっとHTTP通信の勉強してからまたやります…。
・参考文献
MetaWeblog APIのXMLデータ
MetaWeblogAPI関連
FC2ブログのエンドポイント
Movable Type で使える XML-RPC API
MovableTypeを制覇する
JavaScript WSSE Header Generator
PerlでHTTP通信
LWPモジュール v5.48
HTTPのステータスコード
この記事のトラックバックURL:
ブログペットの自動投稿
ココロを設置したまではいいけど、置いてあるだけじゃちょっと寂しい。
ので、ブログペットの自動投稿について調べているうちに、割と深いところまで来てしまったのでメモ代わりに色々書いておいてみる。
間違ってたら誰か指摘してくれないかなぁ。
・ブログペットが自動投稿する仕組み
ブログペットはブログサービスのAtomAPI、もしくはXML-RPCにユーザID、Password、記事データを渡す事により、該当のブログに自動的に記事を投稿する。
・WSSE認証
AtomAPI標準での認証はWSSE認証で行われている事が多い。
WSSE認証とは、X_WSSEヘッダを用いて認証用文字列を送信する認証手段で、以下のようなヘッダが送られる。
サーバ側にはPasswordの情報が存在する為、Nonce、Createdと実際のPasswordを用いて同じ手順を実行し、PasswordDigestを比較して認証を行う。
また、PasswordDigestを作る際に、エンコードする前のNonceを用いる事もある。
・起こった問題
最初にブログペットの設定で投稿用APIのURLを設定する必要があるのだが、設定の際に一度GETで情報を取得しに行ってるらしく、認証の為のX_WSSEヘッダを投げてくる。ヘッダの内容は以下。
このCreated、Nonce、実際のPasswordを用いて上で述べたアルゴリズムに従ってPasswordDigetsを生成しても、送られてきたPasswordDigestと異なっているので認証出来ない。
それとも全然違う暗号化してる?
・解決案
1.WSSE認証の詳細を問い合わせてみる
2.認証しないでレスポンスを直接返す
問い合わせたら教えてくれるような内容なんだろうか…orz
ブログ開発者なら教えてもらえそうだけど。
・実際の投稿
ブログペットのページで「ブログエディタ」から実際に記事を投げる事が出来る。
が、何処に投げてるのか不明なので当然投稿失敗。
投稿用APIを設定した時点で、
もしくは一度認証を通らせて、投稿用のURLを取得後にそのURLに向かって投げる設定なのかもしれない。
最初は投稿用APIに直接XMLを投げてるのかと思ったが、アクセス記録を見ても触っている形跡がないのでこれは確実。
<!--なんでもっとシンプルにしてくれないかなぁ…-->
・参考文献
はてなフォトライフAtomAPI
こせきの技術日記
観測気球::ここうさぎ3.09版
こうさぎHACK
Movable Type 3.2 マニュアル
RFC: MetaWeblog API
Atom API Documentation for Blogger
MIME::Base64 - base64文字列のエンコードとデコード
Digest::SHA1 - SHA-1アルゴリズムへのPerlインターフェース
ので、ブログペットの自動投稿について調べているうちに、割と深いところまで来てしまったのでメモ代わりに色々書いておいてみる。
間違ってたら誰か指摘してくれないかなぁ。
・ブログペットが自動投稿する仕組み
ブログペットはブログサービスのAtomAPI、もしくはXML-RPCにユーザID、Password、記事データを渡す事により、該当のブログに自動的に記事を投稿する。
・WSSE認証
AtomAPI標準での認証はWSSE認証で行われている事が多い。
WSSE認証とは、X_WSSEヘッダを用いて認証用文字列を送信する認証手段で、以下のようなヘッダが送られる。
*ID=ppp,Pass=qqqの場合
UsernameToken Username="ppp", PasswordDigest="zmq/giOPXamY+801x/V9hlNV/n0=", Created="2007-12-23T05:24:55Z",
Nonce="N2UwYWU0M2QxZDI2NmJkOTk3ZTMxYT
c4NmY1ODE2YWFmOTkyZjI1NQ=="
ここで、
Username:ID
Nonce:ランダムなバイト列をbase64エンコードしたもの
Created:Nonceが作られた日時をISO-8601表記で記述したもの
PasswordDigest:Nonce,Created,実際のPasswordを連結させてNIST SHA-1メッセージ・ダイジェスト・アルゴリズムで暗号化して出力されたバイト列をbase64エンコードしたもの
具体的には
PasswordDigest = base64( sha1( nonce . created . password ) )
UsernameToken Username="ppp", PasswordDigest="zmq/giOPXamY+801x/V9hlNV/n0=", Created="2007-12-23T05:24:55Z",
Nonce="N2UwYWU0M2QxZDI2NmJkOTk3ZTMxYT
c4NmY1ODE2YWFmOTkyZjI1NQ=="
ここで、
Username:ID
Nonce:ランダムなバイト列をbase64エンコードしたもの
Created:Nonceが作られた日時をISO-8601表記で記述したもの
PasswordDigest:Nonce,Created,実際のPasswordを連結させてNIST SHA-1メッセージ・ダイジェスト・アルゴリズムで暗号化して出力されたバイト列をbase64エンコードしたもの
具体的には
PasswordDigest = base64( sha1( nonce . created . password ) )
サーバ側にはPasswordの情報が存在する為、Nonce、Createdと実際のPasswordを用いて同じ手順を実行し、PasswordDigestを比較して認証を行う。
また、PasswordDigestを作る際に、エンコードする前のNonceを用いる事もある。
PasswordDigest
= base64( sha1( base64_decode( nonce ) . created . password ) )
= base64( sha1( base64_decode( nonce ) . created . password ) )
・起こった問題
最初にブログペットの設定で投稿用APIのURLを設定する必要があるのだが、設定の際に一度GETで情報を取得しに行ってるらしく、認証の為のX_WSSEヘッダを投げてくる。ヘッダの内容は以下。
*ID=ppp,Pass=qqqの場合
UsernameToken Username="ppp", PasswordDigest="1PIF/8v6ji8o7Ppeo7dlxnf0vSU=", Created="2007-12-23T05:24:55Z",
Nonce="N2UwYWU0M2QxZDI2NmJkOTk3ZTMxYT
c4NmY1ODE2YWFmOTkyZjI1NQ=="
UsernameToken Username="ppp", PasswordDigest="1PIF/8v6ji8o7Ppeo7dlxnf0vSU=", Created="2007-12-23T05:24:55Z",
Nonce="N2UwYWU0M2QxZDI2NmJkOTk3ZTMxYT
c4NmY1ODE2YWFmOTkyZjI1NQ=="
このCreated、Nonce、実際のPasswordを用いて上で述べたアルゴリズムに従ってPasswordDigetsを生成しても、送られてきたPasswordDigestと異なっているので認証出来ない。
それとも全然違う暗号化してる?
・解決案
1.WSSE認証の詳細を問い合わせてみる
2.認証しないでレスポンスを直接返す
問い合わせたら教えてくれるような内容なんだろうか…orz
ブログ開発者なら教えてもらえそうだけど。
・実際の投稿
ブログペットのページで「ブログエディタ」から実際に記事を投げる事が出来る。
が、何処に投げてるのか不明なので当然投稿失敗。
投稿用APIを設定した時点で、
この設定では投稿用APIにアクセスできませんでした。
(MetaWeblogとAtomAPIのみ対応しています)
とか言われてるので、多分設定が不十分で投げる場所が未設定になっていると思われる。(MetaWeblogとAtomAPIのみ対応しています)
もしくは一度認証を通らせて、投稿用のURLを取得後にそのURLに向かって投げる設定なのかもしれない。
最初は投稿用APIに直接XMLを投げてるのかと思ったが、アクセス記録を見ても触っている形跡がないのでこれは確実。
<!--なんでもっとシンプルにしてくれないかなぁ…-->
・参考文献
はてなフォトライフAtomAPI
こせきの技術日記
観測気球::ここうさぎ3.09版
こうさぎHACK
Movable Type 3.2 マニュアル
RFC: MetaWeblog API
Atom API Documentation for Blogger
MIME::Base64 - base64文字列のエンコードとデコード
Digest::SHA1 - SHA-1アルゴリズムへのPerlインターフェース
この記事のトラックバックURL:
何かしら