2010年11月25日木曜日

Facebookのアカウントを使ってOAuth認証するメモ

Facebookのユーザーが日本でも増えてるらしいのでFacebookのAPIを使って何かできたらなと思い、とりあえず認証の仕組みを調べてみたのでざっくりとしたメモを残しておきます。

基本的にWebアプリの話です。
iOSアプリの場合はiOS用のSDKをごにょごにょすればあんまり難しいことを考えずにすみます。



なにはともあれ、ドキュメントはこちら

Authentication - Facebook Developers
http://developers.facebook.com/docs/authentication/



Facebookの認証はWebアプリでもデスクトップアプリでもOAuth2.0を利用しています。
Twitterの認証もOAuthなのですが、TwitterのほうはOAuth1.0なので仕様が異なります。

また、Twitterの認証は 「認証即全権限付与」という感じなのですが
Facebookでは パーミッションの付与 ->  認証 という流れになっています。

デフォルトではユーザーのプロフィール情報などのみ取得できます。
メールを送信したり写真/ビデオを扱うためには別途パーミッションをリクエストする必要があります。



以上を踏まえた上で、実際に認証するコードが下のようになります。
facebookが用意しているPython用のコードから一部抜き出しています。

# アプリの設定ページでApplication ID, Application Secretを確認しておく
# http://www.facebook.com/developers/apps.php
FACEBOOK_APP_ID = 'app_id'
FACEBOOK_APP_SECRET = 'app_secret'

class LoginHandler(BaseHandler):
  def get(self):
    verification_code = self.request.get("code")
    args = dict(client_id=FACEBOOK_APP_ID, redirect_uri=self.request.path_url)

    if self.request.get("code"):
      # authorizedされたらcodeが飛んでくる
      # そのcodeを利用してaccess_tokenを取得するリクエストを投げる

      args["client_secret"] = FACEBOOK_APP_SECRET
      args["code"] = self.request.get("code")
      content = urllib.urlopen(
                  "https://graph.facebook.com/oauth/access_token?" +
                  urllib.urlencode(args)).read()

      # access_token=***&expires=*** というクエリストリング形式の文字列が返ってくるのでパースする
      response = cgi.parse_qs(content)
      access_token = response["access_token"][-1]

      # access_tokenがゲットできたらプロフィール情報も取得できる
      profile = json.load(urllib.urlopen(
                  "https://graph.facebook.com/me?" +
                  urllib.urlencode(dict(access_token=access_token))))

      self.redirect("/")
    else:
      # 認証用のコードがなければauthorizeへリダイレクト (パーミッションの確認)
      self.redirect(
        "https://graph.facebook.com/oauth/authorize?" +
        urllib.urlencode(args))
その他、Cookieを仕込んだりaccess_tokenやプロフィール情報をストレージに格納したりログアウト処理の実装は割愛
PHP用のコードもfacebookが用意してくれているので必要な方はそちらをどうぞ。

access_tokenがあってパーミッションが与えられていればGraph APIの各メソッドを実行することが可能です。


FacebookはなんとJavaScript用のSDKまで用意していて、これを使えばJavaScriptオンリーで認証やGraph APIの利用が可能になっています。



[2011/02/03 追記]

OAuth 2.0の概要やOAuth 1.0とOAuth 2.0の違いなどは下の記事が参考になります。
OAuth 2.0でWebサービスの利用方法はどう変わるか

0 件のコメント: