Yahoo!BOXのAPIがクローズされてしかたが無くDropBoxの認証系の処理を書いていたので、ついでにIoTなデバイスにTokenを渡す方法を試してみた。セキュリティ的なところとかまったく考えていないので、こういう事ができる程度のメモです。
もちろんFreeBSDが動作しているRT3050なデバイスにshttpdをビルドして置いておく。httpsするためにlibsslも必要でした。ZRouterにはprofiles/contribにshttpd 1.42が入っています。shttpdはmongooseというプロジェクトに移ったようだ。
mongooseの方はソースのダウンロードが、comなサイトに誘導されるので、プロジェクトを売ってしまって、商用ライセンスとGPLなライセンスが変わってしまったのかもしれない。
httpsできる軽い実装をいろいろ探してみたのだが、shttpdが一番手頃のようだ。mrubyでもhttpなサーバの実装はあるが、今のところhttpsはサポートされていないようだ。
証明書はオレオレ証明書をpemで作り、秘密鍵のpemとcatしておく。
$ shttpd -ssl_cert shttpd.pem -ports 80,443s
shttpd 1.42 started on port(s) 80,443s, serving .
shttpdはgoogleで検索してもほとんど情報が引っかからない。。。sslの場合portsの番号の後ろにsを付けるのが分からず少しはまった。
以下のHTMLを置いておく
<HTML>
<BODY>
<A HREF="https://www.dropbox.com/1/oauth2/authorize?client_id=himitu&re
sponse_type=code&redirect_uri=https://10.0.1.8/oauth2.cgi&state=morimori">
DROPBOX OAuth2</A>
</BODY>
</HTML>
このリンクを叩くとDropBoxに飛んでログインしていれば承認のページに遷移する。
DropBoxのMy appsの登録ページのRedirect URIsにhttps://10.0.1.8/oauth2.cgiを追加しておくことも忘れずに。
おおよその流れはこんな感じ。
後はoauth2.cgiに渡されたURIのcodeを使ってBearer Tokenを拾ってAPIをアクセスする。
app secretは簡単に見えるようなところには置かないようにしなければなりません。
OAuth2の良いところはOAutheではSHA1などのハッシュ処理が必要だったのが無いことがあります。