Outlook OAuth 2.0 でハマった話

OAuth

http://oauth.net/2/ OAuth2.0の備忘録的まとめ

RESTful APIでは常識になっているOAuthですが、 今回、私はOutlookOAuth認証にハマりました。(´・ω・`)

ことの始まり

Outlookのスケジュールを管理できるアプリ欲しいなという要望のもと、 「Cordovaで簡単にアプリ作っちゃおう!!」 という感じでスタートしました。 この時はまだ、OAuth認証で丸一日以上を費やすとは思ってなかった・・・。 今までにOAuthを使ったAPIを何度か扱ったことはありますが、アクセストークンが取れないということはなかったです。

なぜハマったのか

それは今まで、OAuthライブラリーに頼っていたから。 つまり、実際にどうやってaccess_tokenを取得するかを理解していなかった。 ここで、ライブラリーに頼ってばかりではダメだと痛感しました。 CordovaのOAuthライブラリには、Outlookに対応しているものがなかったので、自前でOAuth認証を実装する必要がありました。 https://github.com/nraboy/ng-cordova-oauth ↑にOutlook(Office365)用のOAuth認証の機能を実装して、プルリクを送っておきます。

実際にコードを見てましょう。

AngularJS 1.5.xで書いています。

...

function oauthOutlook(client_id, client_secret, redirect_uri) {
    var deferred = $q.defer();
    var browser = window.cordova.InAppBrowser.open('https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=' + client_id + '&redirect_uri=' + redirect_uri + '&response_type=code' + '&scope=openid+https%3A%2F%2Foutlook.office.com%2Fcalendars.read', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
    browser.addEventListener('loadstart', function(e) {
        if((e.url).indexOf('code') != -1) {
            var requestToken = (e.url).split("code=")[1];
            if(requestToken) {
                $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
                // client_id : client_secret をBase64にエンコード
                $http.defaults.headers.post['Authorization'] = 'Basic ' + window.btoa(client_id + ':' + client_secret);

                $http({method: "post", url: "https://login.microsoftonline.com/common/oauth2/v2.0/token", data:
                    "client_id=" + client_id +
                    "&code=" + requestToken +
                    "&redirect_uri=http://localhost/callback" + 
                    "&client_secret=" + client_secret +
                    "&grant_type=authorization_code" +
                    "&scope=" + "openid+https://outlook.office.com/calendars.read"
                })
                .success(function(data) {
                    deferred.resolve({ access_token: data.access_token});
                    console.log("access_token", data.access_token);
                })
                .error(function(data, status) {
                    deferred.reject("Problem authenticating");
                })
                .finally(function() {
                    setTimeout(function() {
                        browser.close();
                    }, 10);
                });
            }
        } else {
            deferred.reject("please login");
        }
    });

    return deferred.promise;
}
...

参考: Java プログラミングで実装する OAuth 2.0 クライアント: 第 2 回 クライアント・クレデンシャル・グラント

海外インターンを経験して思うこと。 一回は経験したほうがいいと思う。

1. グローバルで働くということを意識して海外インターンをした

私にとってのグローバルとはオフィスが海外に存在していて、外国人がいて、英語で会話して、という典型的なものでした。

将来的にはグローバルで働くこともあるのかな?と考えていたので、海外インターンに行ってみました。

私が実際にベトナムホーチミンにて2ヶ月弱、海外インターンを経験したことについて共有します。

 

2. 現地での仕事について

①どんなことをしたのか

日本では、Titanium Mobileでスマホアプリの開発を行っていたので、

ベトナムでもスマホアプリの開発を行いました。ベトナム人のサーバーサイド担当の方と連携、協力してアプリ開発しました。

 

②1つのプロジェクトを担当

日本のインターンではバグの修正やデザインの修正などのチケット処理をしていましたが、

ベトナムでは、実案件のプロジェクトを任せてもらい、フロントサイドのメイン開発を担当しました。メンター兼マネージャーとしてついてくれる方はいました。
開発に責任を持ち、自発的に行動し、チケットを管理するということを学びました。

 

③コミュニケーションの難しさを感じた

私も彼らも英語を満足に話せるわけではないので、お互いに言いたいことを伝えることは大変でした。

特にベトナム人の発音を聞き取れないことが多かったです。そういう時は紙に書いてもらう、タイピングしてもらう、という形でコミュニケーションをとりました。
APIの修正を依頼するときは、欲しいレスポンスデータを紙に書いたり、APIドキュメントを修正したりということをして修正内容を伝えました。

 

3. 現地での生活について

① 衣食住、移動について 

衣類は日本から持って行ったものを洗濯して、着回していました。

ベンタイン市場という場所に行けば、T-シャツは500円ほどで購入できます。
食事は高くて2000円、安くて200円とピンキリです。だいたい一食あたり、300円、400円ほどでした。
ランチは現地社員たちと一緒に食べて、気軽に会話を楽しみます。毎日お店でしたが、ベトナムの方は飽きるということがないのかな。

f:id:yokurin:20151102160537j:plain

ランチ(ご飯、野菜、お肉(鳥、豚、牛から選べる) ) 約250円

 

住居は、会社で用意して頂いたアパートに住みました。私のアパートは週3回お手伝いさんがシーツを替えてくれて、部屋のお掃除もしてくれます。

洗濯機とキッチンは最上階に共有スペースがあるので、そこを使用します。

f:id:yokurin:20151102160756j:plain

 

移動は基本的にタクシーでした。ベトナムではバイクが主な移動手段なので、私はタクシー以外の移動手段がないのです。目的地が近いときは歩きました。歩道がありますし、道も舗装してあります。
しかし、ベトナムは信号や横断歩道が少なくて、バイクだらけなので道を渡る時は注意が必要です。

f:id:yokurin:20151102160928j:plain

 

② 週末は観光や旅行

週末は先輩やベトナムの方と一緒に、ホーチミン市内を観光しました。レタントン通り、ドンコイ通り、ベンタイン市場などホーチミンの観光スポットはほとんど行きました。
旅行は、ホーチミンから離れて、ニャチャンというリゾート地へ行きました。海が綺麗で、いいリフレッシュになりました。

f:id:yokurin:20151102161241j:plain

 

4. 日本のインターンと海外インターン

日本でインターンを2回経験し、今回が海外インターン1回目でした。

① 住み込みでインターン

実際の住み込みというわけではないですが、日本の自分の家に帰るわけではないのでホーチミンのアパートに帰っても、自分の家ではないという違和感がありました。そのせいか、色んなことに対するモチベーションを常に保つことができたように思います。

② ほとんどの時間を作業に費やす

週末に出かけたりしていましたが、それ以外に予定がないので、それ以外の時間はプログラミングをしていました。プライベートでも自分の作業を邪魔するようなもの(飲み会、デート、遊び、趣味など)ないので、日本にいるときよりも作業に集中できました。

 

5. 自分を見つめ直す

① 日本人エンジニアとして働くということ

ベトナムのエンジニアの給与は日本と比べて1/3ほどなのに、技術力は日本と比べて差がなかったと思います。将来グローバルで働くようになったとき、自分にどんな価値があるだろうかと考えました。人それぞれ答えがあると思いますが、各々自分なりの答えを出す必要があると思います。

②今後の活動について

私にはプロダクトを作り上げる力と経験が足りないことに気付かされたので、もっと自発的にコードを書き、様々なプロダクトを作ることで技術力、経験、製品を作る力を向上させたいと思います。

 

 

上記に書いてきたように、海外インターンに行ってみて感じることは人それぞれあると思います。

海外インターンに行くことで失うものはなく、得るものは山ほどあると思います。みなさんも、ぜひ。