認可

mixi Graph APIの利用登録

サービスの登録

事前にmixi Platformへの登録が完了している必要があります。

  1. 個人パートナーのページで、クレジットカードを登録※1します。
  2. mixi Graph APIのサービス管理ページでサービスを登録します。

※1 mixi Graph APIを利用するには、「mixi有料サービス」のクレジットカード登録が必要です。これは身分証明のためであり、APIの利用では課金が発生することはないとのことです。 個人パートナーのクレジットカード登録 << mixi Developer Center

サービスの設定

次の3項目が必須となっています。

  • サービス名
  • リダイレクトURL
  • お問い合わせ用メールアドレス

リダイレクトURL

リダイレクトURLは、OAuthによる認可時にリダイレクトされてくるページのURLです。どこへリダイレクトされるかはこの設定により決定されるため、正確に記述します。

Consumer KeyとConsumer Secretの取得

サービス管理ページで登録したサービスを選択すると、「Consumer Key」と「Consumer Secret」を取得できます。

サービスの削除

[サービス設定変更]ページ最下部の[削除する]をクリックします。

ユーザーによるアプリケーションの認可

認可の手順の概略は、

  1. Consumer Keyを使用して、Authorization Codeを取得する。
  2. Authorization Codeを使用して、アクセストークンを取得する

となります。ここで取得したアクセストークンを使用して、各種APIへアクセスできるようになります。

Authorization Codeの取得

発行されたAuthorization Codeの有効期限は3分です。

アクセストークン (Access token) の取得

発行されたアクセストークンの有効期限は15分です。

サンプルコード

class MixiOAuth {
    private $consumerKey;
    private $consumerSecret;

    private $apiUrl = 'https://api.mixi-platform.com/2/';
    private $tokenUri = 'https://secure.mixi-platform.com/2/token';

    //
    public function __construct( $consumerKey, $consumerSecret )
    {
        $this->consumerKey = $consumerKey;
        $this->consumerSecret = $consumerSecret;
    }


    // GET
    public function Get( $url, $params = null )
    {
        return $this->Request( 'GET', $url, $params );
    }

    // POST
    public function Post( $url, $params = null )
    {
        return $this->Request( 'POST', $url, $params );
    }

    // リクエスト
    private function Request( $method, $url, $params = null )
    {
        $status = $this->GetResponse( $_SESSION[ 'access_token' ], $method, $url, $params );

        if( @$status[ 'error' ] == 'expired_token' )
        {
            $token = $this->UpdateToken( $_SESSION[ 'refresh_token' ] );
            if( isset( $token[ 'error' ] ) )
            {
                $status[ 'error' ] = $token[ 'error' ];
            }
            else
            {
                $_SESSION[ 'access_token' ] = $token[ 'access_token' ];
                $_SESSION[ 'refresh_token' ] = $token[ 'refresh_token' ];

                $status = $this->GetResponse( $_SESSION[ 'access_token' ], $method, $url, $params );
            }
        }

        return $status;
    }

    // レスポンスの取得
    private function GetResponse( $access_token, $method, $url, $params = null )
    {
        $header = 'Authorization: OAuth '.$access_token;
        $ch = curl_init();

        switch( $method )
        {
            case 'GET':
                if( isset( $params ) )
                {
                    $url .= '?'.http_build_query( $params );
                }
                break;

            case 'POST':
                if( !isset( $params ) )
                {
                    $params = '';
                }

                curl_setopt( $ch, CURLOPT_POST, TRUE );
                curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
                break;
        }

        curl_setopt( $ch, CURLOPT_URL, $this->apiUrl.$url );
        curl_setopt( $ch, CURLOPT_HTTPHEADER, array( $header ) );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
        curl_setopt( $ch, CURLOPT_HEADER, TRUE );

        //
        $result = array();

        $response = curl_exec( $ch );
        if( $response === FALSE )
        {
            $result[ 'error' ] = curl_error( $ch );
        }
        else
        {
            $httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
            if( $httpCode == 200 )
            {
                $lines = explode( "\n", $response );
                $body = $lines[ count( $lines ) - 1 ];

                $result = json_decode( $body, TRUE );
            }
            else if( preg_match( '/WWW-Authenticate:.*error=\'([^\']*)/', $response, $error ) )
            {
                $result[ 'error' ] = $error[ 1 ];
            }
            else
            {
                $result[ 'error' ] = 'unknown error. code:'.$httpCode;
            }
        }
        curl_close( $ch );

        return $result;
    }

    // アクセストークンの取得
    public function GetToken( $authorizationCode, $redirectUri )
    {
        $params = array(
            'code'=>$authorizationCode,
            'grant_type'=>'authorization_code',
            'client_id'=>$this->consumerKey,
            'client_secret'=>$this->consumerSecret,
            'redirect_uri'=>$redirectUri
            );

        $ch = curl_init( $this->tokenUri );
        curl_setopt( $ch, CURLOPT_POST, TRUE );
        curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params ) );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
        curl_setopt( $ch, CURLOPT_FAILONERROR, TRUE );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );

        $response = curl_exec( $ch );
        if( $response === FALSE )
        {
            $token = array( 'error'=>curl_error( $ch ) );
        }
        else
        {
            $token = json_decode( $response, TRUE );
        }
        curl_close( $ch );

        return $token;
    }

    // アクセストークンの更新
    private function UpdateToken( $refresh_token )
    {
        $params = array(
            'refresh_token'=>$refresh_token,
            'grant_type'=>'refresh_token',
            'client_id'=>CONSUMER_KEY,
            'client_secret'=>CONSUMER_SECRET
            );

        $ch = curl_init( $this->tokenUri );
        curl_setopt( $ch, CURLOPT_POST, TRUE );
        curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params ) );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
        curl_setopt( $ch, CURLOPT_FAILONERROR, TRUE );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );

        $response = curl_exec( $ch );
        if( $response === FALSE )
        {
            $token = array( 'error'=>curl_error( $ch ) );
        }
        else
        {
            $token = json_decode( $response, TRUE );
        }
        curl_close( $ch );

        return $token;
    }
}