Microsoft Azrue Mobile Servicesでは、Microsoftアカウント、Facebook、Google、Twitterなどを認証寄稿として利用できます。
Facebook認証を選択した場合、そこで取得したアクセストークンを使ってカスタムAPIからFacebookに自動投稿することができます。
AEDオープンデータプラットフォームにてbetaテスト中の更新機能もこの機能を使って位置情報を登録、更新したときにFacebookに自動投稿をして(あとは、SendGrid使ってメールも飛ばして)います。このように操作履歴をSNSに投稿することで、位置情報の収集に貢献している人の見える化、そして、いたずらの発見と戻しがスムーズに行えるように考慮されています。
つまり、Facebookの自動投稿をクライアント側ではなく、Mobile Services側に実装することで投稿を回避するような迂回ができなくなるわけです。
Facebookにアプリを登録
Facebookを認証機構として使う場合は次のようにします。
Facebookに開発者登録を行い、アプリ登録を行います。
Microsoft Azrue Mobile Services側でFacebook認証を行うのならば、ここでは「ウェブサイト」として登録してMobile Servicesに作成したサービスのURLを登録します。
FacebookアプリをMobile Servicesに登録
Facebookにアプリを登録するとアプリケーションIDとアプリのシークレットキーが生成されますので、これをMobile Servicesに登録します。
カスタムAPIにアクセス制限をかける
アクセス制限をかけたいカスタムAPIのメソッドに対して「認証されたユーザーのみ」を設定します。
この設定によりFacebook認証を行わずにGETしようとすると次のようなエラーが発生します。
認証を通してアクセス制限がかかったカスタムAPIメソッドを実行する
Windows Azrue Mobile Services側でFacebook認証を行うためには、Mobile Services SDKを使ってクライアント側で次のコードを実行します。
await mobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook);
このコードを実行すると自動的にFacebookのログイン画面がSDKにより表示されます。
FacebookのIDとパスワードを入れて[ログイン]をクリックして成功すれば、アクセス制限のかかったカスタムAPIにアクセスできます。
カスタムAPI
それでは最後にFacebookに投稿するためのカスタムAPIについてみていきましょう。
exports.post = function(request, response) { PostFacebook(request,'UPDATE',response); }; function PostFacebook(request,mode,response,results) { var user = request.user; var LocationName = request.body.LocationName; var FacilityPlace = request.body.FacilityPlace; var VenueId = request.body.VenueId user.getIdentities({ success: function(identities) { if (identities.facebook) { var req = require('request').defaults({strictSSL: true}); var fbAccessToken = identities.facebook.accessToken; var providerId = user.userId.substring(user.userId.indexOf(':') + 1);; var userName = ""; var userLink = ""; /* get user info */ { var uri = 'https://graph.facebook.com/' + providerId + '?access_token=' + fbAccessToken; req(uri, {json: true},function(err,resp,body) { if (err) { console.error('Error sending data to FB Graph API: ', err); response.send(statusCodes.INTERNAL_SERVER_ERROR); } else { if (resp.statusCode !== 200) { console.error(JSON.stringify(body)); response.send(statusCodes.INTERNAL_SERVER_ERROR); } else { userName = body.name; userLink = body.link; /* post feed for Facebook page */ if (userName.length > 0) { var message = "posted:" + userName + " " + userLink + "\n"; message = message + mode + ":" + LocationName; if (FacilityPlace) { message = message + " " + FacilityPlace + "\n"; } message = message + "\n"; if (VenueId) { message = message + " https://ja.foursquare.com/v/" + VenueId; } var uri = 'https://graph.facebook.com/614536118659766/feed'; req.post(uri, { form: { message: message, access_token: fbAccessToken }, json: true }, function(err,resp,body) { if (err) { console.error('Error sending data to FB Graph API: ', err); response.send(statusCodes.INTERNAL_SERVER_ERROR); } else { /*if (resp.statusCode !== 200 && resp.statusCode !== 506) { if (mode == "INSERT") { InsertData(request,response); } else { UpdateData(request,response); } console.error(JSON.stringify(body)); response.send(statusCodes.INTERNAL_SERVER_ERROR); } else { } */ if (mode == "INSERT") { InsertData(request,response); } else { UpdateData(request,response); } } }); } else { response.send(statusCodes.BAD_REQUEST); } } } }); } } }, error : function() { response.send(statusCodes.INTERNAL_SERVER_ERROR); } }); }
このカスタムAPIを呼び出せば、更新時には次のような投稿が自動的にFacebookページに送られます。
以上