はじめに
こんにちは。フリーランスエンジニアなりたての石井と申します。決済できるソーシャルイベントプラットフォーム「Zusaar」(ズサー)というサービスを作りました。
このZusaarではTwitterやFacebook、mixiのアカウントを使ってログインしますが、最近では同じくこれらの仕組みを使ったソーシャルなWebアプリ/サービスがますます増えてきています。
本連載では、こういったソーシャルアプリをすばやく実現するのに必要なノウハウを解説していきます。
対象読者
ソーシャルアプリの開発はさまざまな開発言語で行えますが、今回はJavaを使った実装例を示しますのでServletなどの知識が必要です。StrutsなどのWebフレームワークをお使いの場合は適宜置き換えて読み進めてください。
必要な環境
- Servletコンテナー
SNSアカウントでのログイン
「ソーシャルネットワークサービス(SNS)のアカウントによるログイン」は、一般的にOAuth(オーオース)というオープンな仕様を利用して実現しています。
OAuthとは
OAuthの詳細仕様の説明は省きますが、簡単に言うと、SNSユーザー本人の認可の下、SNS側からアクセストークン(委任状のようなもの)が発行され、それをソーシャルアプリ側が預かる仕組みです。以降、ソーシャルアプリのプログラムがアクセストークンを用いると、本人に代わってSNSの機能(API)を実行できるようになります。
「ユーザー本人の認可の下で、本人に代わってプログラムからAPIを実行できる」のが本来のOAuthの目的なのですが、APIを実行した結果としてユニークなIDや本人情報を取得できるので、"認証にも"利用されているのが実態です。Webサービスの会員登録・ログインに通常必要となるIDやパスワードを管理する必要がないため、ユーザー、ソーシャルアプリ運営側ともに情報漏洩時の悪影響を低減できるメリットもあります。
一方、ユーザーはソーシャルアプリにアクセストークンという"委任状"を預けることに対する不安も生まれます。アプリが本人に代わってSNS上の情報を好き勝手にすることも不可能ではないからです。そのため、パーミッションという仕組みで委任状ごとに権限を制限できるようになっています。
パーミッションの分け方はSNSによってさまざまですが、アプリが必要以上のパーミッションを要求すると、ユーザーには認可を敬遠される上、アプリ側にとってもセキュリティ上のリスクが増します。ソーシャルアプリで実現したいことと、各SNSから提供されるパーミッションの分類をよく吟味し、必要最低限のものだけ使うようにしましょう。
OAuthのバージョン
OAuthには1.0と2.0というバージョンがあります。それぞれ目的は同じですが、実現する方式が少し異なります。Twitterでは1.0が使われ、Facebook、mixiでは2.0が用いられています。仕様が複雑な1.0は様々な言語でライブラリが存在するのが普通ですので、その有無や作りたいアプリとの相性をよく確認しましょう。
OAuthはSNS専用の仕組みではありません。ユーザーのデータを外部から安全に利用するための仕組みで、Google Apps、Dropbox、Yahoo!や"はてな"の各APIでも用いられています。
なお、OAuthの用語では、APIを提供する側をサービスプロバイダー、APIを利用する側をコンシューマーやクライアントと呼びますが、いざ実装する場面ではあまり重要ではなく説明を簡潔にするために本稿ではそういった用語をあえて控えています。
OAuthを利用する準備
開発用ドキュメントの確認
ソーシャルアプリ開発者向けのドキュメントが各SNSで用意されています。
- Twitter: 「Documentation」
- Facebook: 「Getting Started」
- mixi: 「mixi Graph API」
OAuthを使ったAPIの利用方法以外に、「いいね!」ボタンの実装手順といった情報もまとまっています。
開発者登録、アプリケーション登録
OAuthの仕様上必要な秘密鍵(SNSとソーシャルアプリの間で同じものを共有する)を発行してもらうために、アプリケーションの登録が必要になります。詳細は後述します。
SNSによっては氏名や住所などの開発者の情報が必要となりますが、全ユーザーのアクセストークンという"委任状"を与えられる開発者の質もこうして担保されている訳です。
APIの仕様
アクセストークンの取得後、そのアクセストークンを使用するAPIについては統一された仕様がありませんので、使いたいAPIの仕様をよく確認してください。これらのAPIは、例えばFacebookではGraph API、mixiではmixi Graph APIというように独自の名称で呼ばれていることもあります。