携帯の緊急地震速報の音が怖いので、「会いたかった」に変えるHackを募集しています。
こんばんは。
OAuth 2.0は仕組も特徴も理解していたのですが、実際に実装の必要が出てきたので今更ながら初めて使ってみました。
仕様は現在draft15というステータスで公開されています。(The OAuth 2.0 Authorization Protocol) OAuth 2.0の特徴としてはHTTPSを使って通信経路を暗号化することによりトークンを直接やりとりすることが可能となっています。そのため署名が必要なくなり、あの悪夢のような署名検証をしなくて済むようになったのが大きなメリットです。
とはいえ、読んでもよくわかんないのでコードにしてみます。Authorization ServerとResource Serverとして使ってみるのはFacebook。クライアントサイドフローとサーバーサイドフローの二つをサポートしているので、今回はサーバーサイドフローでテスト。ドキュメントはCore Concepts - Authenticationを見ました。
まずはFacebook Developersでアプリの登録が必要。もちろんFacebookのアカウントも必要。
このときに忘れちゃダメなのがWeb Siteの設定でSite URLとSite Domainの指定をする必要があること。Authorization Serverからのリダイレクト先はSite Domain下のURLしか許可されないのでここが抜けてると動きません。
設定に必要なApplication IDとApplication Secretも控えておきます。
CPANにはNet::OAuth2やOAuth::Lite2やそもそもFacebookであればNet::Facebook::OAuth2などがありますが、愚直に実装しないと理解できない子なので、使わないで書いてみます。こういう捨てWeb ApplicationのコードはPlackを使うととっても簡単。
内容はFacebookで認証してFacebookの友達情報を取得して表示するだけの簡単なお仕事。
短い。
フロー順に説明すると
1)
まず、何にもパラメータがない場合は、Facebook のAuthorization endpoint にユーザーをリダイレクトしてFacebookの認証を受けさせに行きます。
2)
認証が通ると、redirect_uriに指定したURLにユーザーがリダイレクトされてきます。この際にAuthorization Codeがcodeパラメータとして渡されます。
3)
このCodeを友達情報などのProtected Resourceアクセスのために使うAccess Tokenとサーバーサイドで交換します。
この際にパラメータに要求元を証明するための秘密鍵であるConsumer Secretなど本来ネットワークに流すべきではないものをつけてリクエストするのですが、このリクエストがHTTPS必須になっているので途中で改ざんされたりしないので安全であるというのがミソです。
このリクエストが成功するとAccess Tokenがレスポンスとして直接返るのですが、これもHTTPSなので安全ですよと。
4)
あとはこのAccess Tokenを利用して友達情報などを取得してユーザーに表示します。
かなりシンプルなのでライブラリが必要ないくらいです。
この次はAuthorization Server と Resources Server 側の実装検証をしてみたいなあと思います。

コメントする