koogawa blog

iOS、Android、foursquareに関する話題

foursquareに簡単にログインできる「FSOAuthを使ってみた

FSOAuthとは 

Foursquare native authentication makes it easier for your app's users to connect with Foursquare. Unlike web-based OAuth, native authentication re-uses the Foursquare app's user credentials, saving users the hassle of re-logging in to Foursquare within your app.

ようするに、foursquare公式アプリiPhoneにインストールされていれば、その認証情報を再利用して簡単にfoursquareへログインできるっぽいです。

https://github.com/foursquare/foursquare-ios-oauth/blob/master/README.md の内容を元に、FSOAuthの使い方をメモしておきます。

※和訳に誤りがあればご指摘ください!

まずはアプリケーション登録

認証にはクライアントIDコールバック先URLが必要になるので、まずは下記URLからアプリケーション登録をしておきましょう。

https://ja.foursquare.com/developers/apps

コールバック先には fsoauthexample://authorized を設定しておきました。

3つの重要なメソッド

FSOAuthの認証では、次の3つのメソッドを使用するようです。

+ (FSOAuthStatusCode)authorizeUserUsingClientId:(NSString *)clientID callbackURIString:(NSString *)callbackURIString;

 アプリケーション登録時に発行されるクライアントIDと、コールバック文字列を使用してこのメソッドを呼び出します。foursquareの公式アプリがインストールされている場合はアプリが自動的に切り替わり、認証ダイアログが表示されます。

f:id:koogawa:20130908043006p:plain

 ユーザが承認または拒否を選択した後、accessCodeと共にコールバック先が呼ばれ、元のアプリに戻ってきます。

このメソッドが返す戻り値

  • FSOAuthStatusSuccess - OAuthの要求が正常に開始された。
  • FSOAuthStatusErrorInvalidClientID - クライアントIDが間違っている。
  • FSOAuthStatusErrorInvalidCallback - コールバック文字列が間違っている。
  • FSOAuthStatusErrorFoursquareNotInstalled - ユーザーのiOSバイスfoursquareの公式アプリがインストールされていない。この場合はApp Storefoursquareアプリダウンロード画面に遷移する。
  • FSOAuthStatusErrorFoursquareOAuthNotSupported - ユーザーのiOSバイスにインストールされたfoursquareアプリのバージョンが古すぎる。

+ (NSString *)accessCodeForFSOAuthURL:(NSURL *)url error:(FSOAuthErrorCode *)errorCode;

コールバック時に受け取ったURLを引数に渡し、このメソッドを呼び出します。メソッド内部でURLのパラメータからアクセスコードとエラーコードを解析し、戻り値として返します。

エラーコードの値

  • FSOAuthErrorNone - エラーなし。アクセスコードが正常に読み取られた。
  • FSOAuthErrorUnknown - 認識できないエラー文字列がフォースクエアのサーバーから返された。
  • FSOAuthErrorInvalidRequest/ FSOAuthErrorInvalidClient/ FSOAuthErrorUnauthorizedClient/ FSOAuthErrorInvalidGrant/ FSOAuthErrorUnsupportedGrantType - これらの列挙値はhttp://tools.ietf.org/html/rfc6749#section5.2 に記載されているOAuthのエラーコードに対応している。

 + (void)requestAccessTokenForCode:(NSString *)accessCode

                         clientId:(NSString *)clientID

                callbackURIString:(NSString *)callbackURIString

                     clientSecret:(NSString *)clientSecret

                  completionBlock:(FSTokenRequestCompletionBlock)completionBlock;

accessCodeForFSOAuthURL: で得られたアクセスコードクライアントIDコールバック文字列クライアントシークレットを元に、アクセストークンを非同期通信でリクエストします。

リクエストが完了すると、次の完了ブロックが呼び出されます。

typedef void (^FSTokenRequestCompletionBlock)(NSString *authToken, BOOL requestCompleted, FSOAuthErrorCode errorCode);

  • authToken - リクエストが成功した場合、APIにアクセスするためのアクセストークンが設定されます。
  • errorCode - サーバーからのエラーコード。これは、+ accessCodeForFSOAuthURLerrorCodeと同じ値を持ちます。
  • requestCompleted - リクエストが正常に完了した場合はYESになります。これがNOの場合、authTokenとerrorCodeの値を参照するべきではありません。
注意

WARNING: For security reasons, it is recommended that you not use this method if possible. You should pass the returned accessCode to your own server and have it contact the Foursquare server to convert the code to an access token instead of including your client secret in your app's binary. However, this helper method is provided for you to use if this is not possible for your app.

セキュリティ上の理由から、このメソッドを使うことはあまり推奨されていないようです。クライアントシークレットをアプリ内で持つことはせずに、サーバ上でアクセスコード→アクセストークンの変換をおこなうのが正しいようです。どうしてもこの方法が使えないときのために、このメソッドが用意されているようです。

サンプルアプリケーション

ひと通りの認証フローをテストできるサンプルアプリケーションが同梱されています。

f:id:koogawa:20130908043730p:plain

サンプルのソースコードを眺めてみると、処理の流れを把握しやすいと思います。

まとめ

  • FSOAuthを使えば、ユーザーは簡単にfoursquareにログインできる
  • ただしユーザのデバイスfoursquareの公式アプリがインストールされており、かつ、ログイン済みである必要がある
  • 公式アプリがインストールされていない場合は、App Storeのダウンロード画面に飛ばされる
  • クライアントシークレットはアプリ内に保存するべきではない(サーバに保存する)

 

foursquareマーケティング 位置情報の賢い使い方