ParseのPFFileのパーミッション設定について気になったのでメモ。
Parseに画像を保存しようとすると、PFFileなるクラスを使うことになる。
画像データを文字列に変換してNSString型のレコードを作るという裏技はあるけど、 コストはPFFileが$0.03/GBに対して、NSStringにすると$200/20GBで割高になってしまう。 これは、ParseのバックエンドがAWSで、PFFileはS3に入れているが、NSStringはDBに入れているためだと思われる。
ただ、PFFileにデータを入れると困ったことにURLが知れてしまうと誰でもアクセスできてしまうという難点がある。
こんな感じのURL。
http ://files.parsetfss.com/XXXXXXXXXX/YYYYYYYYYYYYY
同じように気になった人がいたみたいだけど、中の人の答えは"URLを使わないように実装してね"ってことらしい。
https://www.parse.com/questions/how-do-i-secure-my-image-file-urls-on-the-data-browser
こんな感じだろうか(動作試験してないですが。。。)、まあ確かにアプリで実装する以上URLは漏れなそう。
画像を保存
PFFile *imageFile = [PFFile fileWithData:imageData]; // imageDataは適当に用意 PFObject *object = [PFObject objectWithClassName:@"ClassName"]; object[@"imageFile"] = imageFile; [object saveInBackground];
画像を取得 (コールバック地獄。。。)
PFQuery *query = [PFQuery queryWithClassName:@"ClassName"]; [query whereKey:@"objectId" equalTo:objectId]; //objectIdは適当に用意 [query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) { if (!error && object) { [object[@"imageFile"] getDataInBackgroundWithBlock:^(NSData *data, NSError *error){ // dataを適当に処理 }]; } }];
で、OKといいたいところだけどやっぱりURLが知れた場合に誰でもアクセスできるのは不安。
すごいがんばってfiles.parsetfss.com以下のパスを総当たりで調べたら画像が取得できなくはないし。
個人が作ったアプリだとしても、ユーザーがアップロードした画像を扱うのであればここら辺は神経質に扱いたいところ。
で、どう考えてもParseだと用件が満たせないので画像の保存の部分だけAWSのS3を使うことに。
S3であれば、バケットの権限設定をかなり自由度高くできるので基本的には閲覧権限なし、アプリからのアクセスのみ権限ありという設定ができました。ちゃんちゃん。
アプリに対しての権限設定(一時的なcredentialの発行)に関してはAWS Cognitoが超絶便利。
これに関してはまた別のエントリで書こうかと。
http://aws.amazon.com/jp/cognito/
Parseでも実は画像閲覧権限設定可能だぞ!っていう突っ込みがあったらお待ちしております。