[Parse] 認証を試してみる


Parse は モバイルアプリに特化したBaaS（Backend as a Service） の一種です。

100万リクエスト/月 までのAPIリクエスト/プッシュ送信が無料なのでお試しで使ってみようという魂胆です。

とりあえず時間がないので今回は認証機能のみです。

Android や Xamarin(C#) でも使えるみたいですが、iOS（Objective-C）でいきます。

![kobito.1389613729.383178.png](https://qiita-image-store.s3.amazonaws.com/0/30739/344c8a66-d997-1a90-b934-057c9fbce775.png "kobito.1389613729.383178.png")

# ParseSDK セットアップ
## SDKインストール
いつもどおりcocoapodsからインストールします。

## ParseSDKを初期化

```objectivec:AppDelegate.m

#import <Parse/Parse.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [Parse setApplicationId:@"application_id" clientKey:@"client_key"];

    return YES;
}

```

`application_id` と `client_key`は parse.com 上のAppの値を使用します。

## ソーシャルログインの設定

Facebookも似たようなものだったのでTwitterのみです。

事前に https://dev.twitter.com/apps でアプリケーションを登録しておく必要があります。

```objectivec:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [Parse setApplicationId:@"application_id" clientKey:@"client_key"];

    // dev.twitter.com で登録した`Consumer Key`と `Consumer Secret` を設定
    [PFTwitterUtils initializeWithConsumerKey:@"consumer_key" consumerSecret:@"consumer_secret"];

    return YES;
}
```

### Parseにも設定

parse.com にも同様の設定をします。
![スクリーンショット-2014-01-14-1.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/30739/67ee7491-157c-e511-2b52-78db6634aea8.png "スクリーンショット-2014-01-14-1.04.52.png")

parse.com > Dashboard > アプリ名 > Settings > User authentication で設定できます。

# ログイン処理

## ログインチェック

ログイン済みかどうかを調べます。

```objectivec:
- (void)someAction
{
    if ([PFUser currentUser]) {
        // ログイン済み
    } else {
        // 未ログイン
    }
}
```

## ログインビューを表示

```objectivec:
- (void)someAction
{
    // ログインビューコントローラーを生成
    PFLogInViewController *logInViewController = [[PFLogInViewController alloc] init];
    logInViewController.delegate = self;

    // サインアップビューコントローラーを生成
    PFSignUpViewController *signUpViewController = [[PFSignUpViewController alloc] init];
    signUpViewController.delegate = self;

    // サインアップをログインビューから表示されるようにする。
    [logInViewController setSignUpController:signUpViewController];

    // 表示される要素を指定（Twitter, ログインキャンセル、サインアップ）
    [logInViewController setFields:(PFLogInFieldsTwitter|PFLogInFieldsDismissButton|PFLogInFieldsSignUpButton)];
}
```
あとは プロトコル `PFLogInViewControllerDelegate`, `PFSignUpViewControllerDelegate` を実装して、`loginViewController` を表示すればOKです。

#### ログイン
（ミスってFacebookもでております…）
![iOSシミュレータのスクリーンショット 2014.01.14 1.01.11.png](https://qiita-image-store.s3.amazonaws.com/0/30739/193f35d0-fab5-9acd-ea33-fafdd9a5edaf.png "iOSシミュレータのスクリーンショット 2014.01.14 1.01.11.png")

#### Twitter
![iOSシミュレータのスクリーンショット-2014.01.14-1.01.23.png](https://qiita-image-store.s3.amazonaws.com/0/30739/f6f760b6-5e6b-bd6e-9319-27d6a35f864e.png "iOSシミュレータのスクリーンショット-2014.01.14-1.01.23.png")


#### サインアップ

![iOSシミュレータのスクリーンショット-2014.01.14-1.01.18.png](https://qiita-image-store.s3.amazonaws.com/0/30739/76a414c9-e99f-b401-6eb5-cf48a17a2060.png "iOSシミュレータのスクリーンショット-2014.01.14-1.01.18.png")

レイアウトのカスタマイズはサブクラスから上書きして変更します。

## 実際に登録してみる
実際に登録すると、parse.com 上に反映されます。
![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/30739/dc738326-0298-6394-7e07-6ab82bf04714.png "名称未設定-1.png")

## 手動ログイン

準備されたViewControllerを使わない方法もいい感じでした。

#### ログイン

`[PFUser logInWithUsername:(NSString *) password:(NSString *)]`

#### 登録

```objectivec:
PFUser *user = [PFUser user];
user.username = @"name";
user.password = @"pass";
    
[user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    if (!error) {
        …
    } else {
        …
    }
}];
```

#### Twitterログイン
`[PFTwitterUtils logInWithBlock:(PFUser *user, NSError *error)block]`

#### 既存アカウントとTwitterアカウントの接続
`[PFTwitterUtils linkUser:(PFUser *) block:^(BOOL succeeded, NSError *error)block]`

# なんとなく触ってみて

とりあえずログインはすごく楽でした。
今回は触れてないですが、`PFObject`周りがすごく良さそうな感じです。

`PFObject` はスキーマレスでKeyValueペアなデータ型なのですが、SQLっぽくカラムを指定してParseからデータを取得できる模様。

登録も楽で例えば `PFUser` に電話番号を追加したい時は
> `PFUser` も `PFObject` のサブクラス

```objectivec:
PFUser *user = [PFUser user];
user[@"phone"] = @"080-9999-9999";
```
なんて書いて保存すれば保存できてしまうのです。
パフォーマンスがどうだか知りませんけど、楽ですねー。
（Facebookに買収されるぐらいだから大丈夫でしょうけど。）

ビジネスロジックも parse.com 上で実行できる仕組み（[Clound Code](https://parse.com/products/cloud_code)）があったり、すごく良さげな印象でした！
まさにBaaS！といった感じで、フロントエンドに集中できていい感じがします。
（悲しい事に所詮はフロントしか誰も見ないんですよね笑）

ホスティング機能もあるので、小ぶりなプロジェクトやらはバックエンドをParseに任せてフロントだけBackboneやAngularJSで作るのもアリなのかなと少し思ったり。

オープンソースBaaSの[Helios](http://helios.io/)も触ってみたいですね。