はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Microsoft Azure Mobile ServicesでFacebookに投稿する

Microsoft Azrue Mobile Servicesでは、Microsoftアカウント、FacebookGoogleTwitterなどを認証寄稿として利用できます。

Facebook認証を選択した場合、そこで取得したアクセストークンを使ってカスタムAPIからFacebookに自動投稿することができます。

AEDオープンデータプラットフォームにてbetaテスト中の更新機能もこの機能を使って位置情報を登録、更新したときにFacebookに自動投稿をして(あとは、SendGrid使ってメールも飛ばして)います。このように操作履歴をSNSに投稿することで、位置情報の収集に貢献している人の見える化、そして、いたずらの発見と戻しがスムーズに行えるように考慮されています。

つまり、Facebookの自動投稿をクライアント側ではなく、Mobile Services側に実装することで投稿を回避するような迂回ができなくなるわけです。

 

Facebookにアプリを登録

Facebookを認証機構として使う場合は次のようにします。

image

Facebookに開発者登録を行い、アプリ登録を行います。

Microsoft Azrue Mobile Services側でFacebook認証を行うのならば、ここでは「ウェブサイト」として登録してMobile Servicesに作成したサービスのURLを登録します。

FacebookアプリをMobile Servicesに登録

Facebookにアプリを登録するとアプリケーションIDとアプリのシークレットキーが生成されますので、これをMobile Servicesに登録します。

image

カスタムAPIにアクセス制限をかける

image

アクセス制限をかけたいカスタムAPIメソッドに対して「認証されたユーザーのみ」を設定します。

 

この設定によりFacebook認証を行わずにGETしようとすると次のようなエラーが発生します。

image

 

認証を通してアクセス制限がかかったカスタムAPIメソッドを実行する

Windows Azrue Mobile Services側でFacebook認証を行うためには、Mobile Services SDKを使ってクライアント側で次のコードを実行します。

await mobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook);

 

このコードを実行すると自動的にFacebookのログイン画面がSDKにより表示されます。

image

 

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ページに送られます。image

以上