使ってみよう! Windows Live SDK/API

第45回 OAuth 2.0でLiveへコネクト!

この記事を読むのに必要な時間:およそ 6 分

リソースのアクセス

続いて,リソースのアクセスです。リソースのアクセスはREST APIを利用します。次のURLへアクセスします。

  • https://apis.live.net/v5.0/REST_PATH?access_token=ACCESS_TOKEN

REST_PATHは,アクセスするリソースのパスを指定します。前回までに紹介した内容では,meやme/albumsなどのパスです。ACCESS_TOKENにはアクセストークンを指定します。HTTPのGETやPOSTメソッドのどれを使うかは,リソースの操作内容によって異なります。

ここまでの内容をコードで書いてみましょう。認可コードを受け取った場合,リクエストトークンの取得,REST APIの呼び出しまでまとめて行っています。

<?php
    define('CLIENT_ID',     'xxxxx');
    define('CLIENT_SECRET', 'xxxxx');
    define('REDIRECT_URI',  'http%3A%2F%2Fexample.jp%2F');

    if (isset($_GET['code'])) {
        $msg = createMessage($_GET['code']);
    }

    if (!$msg) {
        $signInUri = 'https://oauth.live.com/authorize' .
            '?client_id=' . CLIENT_ID .
            '&scope=wl.signin&20wl.offline_access' .
            '&response_type=code' .
            '&display=popup' .
            '&locale=ja' .
            '&redirect_uri=' . REDIRECT_URI;
    }

    function createMessage($code) {
        $tokens = getTokens($code);
        if (!$tokens) {
            return "Error";
        } else if (array_key_exists('error', $tokens)) {
            return $tokens['error']['error_description'];
        }

        $res = callRestApi($tokens['access_token']);
        if ($res === false) {
            return "Error";
        } else if (array_key_exists('error', $res)) {
            return $res['error']['message'];
        } else {
            return 'こんにちは ' . $res['name'] . ' さん';
        }
    }

    // 認可コードからアクセストークン取得
    function getTokens($code) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 
            'https://oauth.live.com/token' .
            '?client_id=' . CLIENT_ID . 
            '&redirect_uri=' . REDIRECT_URI .
            '&client_secret=' . CLIENT_SECRET .
            '&code=' . $code .
            '&grant_type=authorization_code');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        // (サーバー証明書を検証しない)
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

        // エラーの場合 false を返す
        $res = curl_exec($ch);
        if ($no = curl_errno($ch)) {
            return false;
        }
        curl_close($ch);
        return json_decode($res, true);
    }

    // REST API の呼び出し (path が me 固定,GET メソッドのみ 対応)
    function callRestApi($token, $path) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 
            'https://apis.live.net/v5.0/' .
            'me' . // path
            '?access_token=' . $token);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPGET, true);

        // (サーバー証明書を検証しない)
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

        // エラーの場合 false を返す
        $res = curl_exec($ch);
        if ($no = curl_errno($ch)) {
            return false;
        }
        curl_close($ch);
        return json_decode($res, true);
    }
?>

上記コードは,REST APIを呼出し,サインインしているユーザーの名前を表示する単純な内容です。エラー処理はHTTP通信エラーの場合は省略,認可サーバーとREST APIのアクセスでエラーが発生したときはメッセージを表示する簡易的な記述しかしてありません。また,URLのクエリーのチェックは省略していますので注意してください。

リフレッシュトークンによる更新

リフレッシュトークンを使ったアクセストークンの更新方法についてもふれておきます。アクセストークンを更新するには次のURLにアクセスします。

  • https://oauth.live.com/token?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN&grant_type=refresh_token

認可コードからアクセストークンを取得するときと比べ,codeパラメーターの代わりにrefrsh_tokenパラメーターを使用して,リフレッシュトークンを指定します。そして,grant_typeパラメーターにはrefresh_tokenを指定します。レスポンスは同様にJSON形式で得ます。

リフレッシュトークンを使用してアクセストークンを得るアプリの場合,データベースなどにリフレッシュトークンを保存し,ユーザー管理を行う必要があります。

おわりに

今回はここまでです。いかがでしたでしょうか。PHPを使った簡単なWebサーバー上で動作するアプリを紹介しました。サーバー側で処理すると,ユーザーがサインインしていないときにも(許可されていれば)ユーザーデータにアクセスでき,SNSサービスなどのアプリも作成可能です。次回は,まだ紹介できていないWindows Liveサービスのユーザーデータ(リソース)について紹介する予定です。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp