[phpFlickr] 重構 phpFlickr 繞過 SESSION 檢查

因為工作需求的關係,需要使用到 phpFlickr 這一個類別來使用 Flickr API。但是,這一個類別有一個問題,就是 SESSION 的檢查,萬一在使用這個類別之前,有先拉出 session 的話,會造成重覆傳遞 auth() 的認證而掛點。在 Firefox 裡面就會告訴你,此網頁重新導向 (Redirect) 方式不正確,的錯誤訊息。

所以,我利用了 php 5 在類別上的一些方法,利用 _get_set 的方式將 session 資料──基於使用習慣,我在開發的時候幾乎都會這麼做──儲存在資料庫中,再接著改寫 phpFlickr 的 Class 將他擴展出來,利用 Class extends 的方式,將原有的類別擴展出一個新的函式,這個函式用來檢查資料庫是否有關於 flickr 的 session 資料,若是有,就將這個 flickr 的 session 丟給 $this->token 就可以了。

這樣就可以在 SESSION 發生問題時,完美解決傳遞錯誤造成的導向不正確的問題囉!

方法很簡單,至於是不是要利用 session 的自訂類別將它儲存在資料庫中,這就見仁見智。基本上,只要把在 auth 做完之後的東西儲存到資料庫就好了。

<?php
DEFINE('ROOT', '../');
require_once (ROOT.'lib/MySQL.class.php');
require_once (ROOT.'lib/UserSession.class.php');
require_once (ROOT.'lib/phpFlickr.php');

/* API KEY */
$api_key                 = "你的 API KEY";
$api_secret              = "你的密鑰";

class flickrAPI extends phpFlickr
{
    /* modify by Hina. */
    function flickrAPI($api_key, $api_secret) {
        global $objSession;
        $this->phpFlickr($api_key, $api_secret);
        $token = (!empty($_SESSION['phpFlickr_auth_token'])) ? $_SESSION['phpFlickr_auth_token'] : $objSession->phpFlickr_auth_token;
        $this->token = (!empty($token)) ? $token : "";
    }

    function auth_getToken ($frob)
    {
        /* http://www.flickr.com/services/api/flickr.auth.getToken.html */
        $this->request('flickr.auth.getToken', array('frob'=>$frob));
        session_register('phpFlickr_auth_token');
        $_SESSION['phpFlickr_auth_token'] = $this->parsed_response['auth']['token'];

        /* modify by Hina. */
        global $objSession;
        $objSession->phpFlickr_auth_token = $this->parsed_response['auth']['token'];

        return $this->parsed_response ? $this->parsed_response['auth'] : false;
    }
}

$__flickr = new flickrAPI($api_key, $api_secret);

上述文中的 $objSession 是我自己所撰寫的 UserSession 類別。你可以在這一篇文章中找到這一個類別來使用。而那個 MySQL.class.php 這個類別可以在這一篇文章中找到。這只是個範例,你可以依照你的需求或是習慣去做修改。

上面那個內文就是一個檔案,我是命名為 api.flickr.php.ini 然後丟到 includes 裡面用 require_once 的方式引入,所以它會自動去呼叫一個 $__flickr 來用,這個就端看個人習慣了。

然後 auth.php 這一支 Call Back 的檔案,也是要修改,但是改的不多。我的 Call back 是放在 /flickrapi/ 目錄底下,所以他的 ROOT 相對位置是 ../,這一點可能跟其他人不同。

<?
define ('ROOT', '../');
require_once (ROOT.'lib/MySQL.class.php');
require_once (ROOT.'lib/UserSession.class.php');
require_once (ROOT.'lib/phpFlickr.php');

$permissions             = "read";
ob_start();
require_once (ROOT.'includes/api.flickr.php.inc');

if (!empty($_GET['extra'])) {
    $redirect = $_GET['extra'];
}

if (empty($_GET['frob'])) {
    $__flickr->auth($permissions, false);
} else {
    $__flickr->auth_getToken($_GET['frob']);
}
if (empty($redirect)) {
    header("Location: " . $default_redirect);
} else {
    header("Location: " . $redirect);
}

注意一下,我的 permissions 是只設定 read 而已。而原來的設定是儲存在 SESSION 裡面的,當然,這也是可以做修改的啦!但是由於我不需要 read 以外的權限,所以我就把這個設定固定在 read 了。

就降,可以完美的繞過 SESSION 的檢查的問題,這樣就可以隨時呼叫 flickr API 來使用,而不會因為 SESSION 問題而卡住了。

Hina Chen
偏執與強迫症的患者,算不上是無可救藥,只是我已經遇上我的良醫了。
Taipei