アプリ開発でのSNS認証のクライアント、サーバーの連携


SNS連携とは

このQuiitaでもよく見られる,ログイン時の「Twitterで登録」などのものです。

今回は

  • firebaseなどのmBaasを使わない
  • WebViewを使わない
  • モバイルアプリ

という条件での
クライアント、サーバーの連携方法をご説明します。(OAuth認証)

クライアント

基本的にクライアント側で認可サーバと連携し、ユーザのアクセス許可をもらいます。
クライアントのフレームワークに準拠しているSNS各種のSDKによって、最近は簡単に実装できています。

認可サーバーから、ユーザー固有のアクセストークンを取得します。
これをサーバーに送ります。

例 SwiftのTwitterSDKを用いた認可サーバーとの連携

TWTRTwitter.sharedInstance().logIn(completion: { (session, error) in
    if (session != nil) {
        print("signed in as \(session.userName)");
    } else {
        print("error: \(error.localizedDescription)");
    }
})

サーバー

クライアントでアクセストークンを取得したからといってそのままアクセストークンをDBに保存してはいけません。なぜなら最近のSNSのアクセストークンは有効期限や使用回数制限などの使用制限が設けられているからです。これにより、複数回の同一文字列のアクセストークンの使用が不可能になっています。
したがって次回ログイン時で特有のUserかを判別するために、アクセストークンではない、別のdataを判別dataにする必要があります。
例えば、メールアドレスです。アクセストークンを使ってSNS提供サーバーから様々なデータを取得することができますが、その一つにメールアドレスもあります。
メールアドレスの利点は、万が一SNSの認可サーバーが使えなくなったりした時に、代用としてメールアドレスログインとして、SNSから取得したメールアドレスを使ったりすることができることです。(ただし、どのSNS提供サーバーでもメールアドレスの取得が可能である訳ではないかつ、SNSで登録したメールアドレスをユーザーが紛失している可能性もああるので、ベストでマストな要件ではないです。)

例 RubyOnRailsでのaccess_tokenを用いたemailの取得

require 'koara'
module FacebookService
  class << self
    def fetch_mail(access_token)
      Koala::Facebook::API.new(access_token).get_object('me')['email']
    end
  end
end