Tìm kiếm nhanh

[Google OAuth] Hướng dẫn lấy token và sử dụng Offline

Thảo luận trong 'Coding' đăng bởi loveall123, 15/08/2016 04:33.

  • Chào các bạn. VIệc lấy Token của Google đã được đề cập đến nhiều, tuy nhiên việc lấy 1 token để sử dụng sau khi hết hạn không phải ai cũng biết.

     

    Vì vậy mình viết bào này nhằm hướng dẫn cách lấy và sử dụng Token offline, chỉ cần xác thực 1 lần và sử dụng mãi mãi. (Đến khi nào tài khoản khách hàng không cấp quyền nữa).

     

    Phạm vi áp dụng của bài hướng dẫn này: Lấy token để lấy thông tin Adsense tự động.

     

    1) đầu tiên bạn cần là thư viện API cho php có thể dowload ở đây

     

    2) Tiến hành thêm tài khoản vào dữ liệu. Bạn cần xác thực lần đầu tiên và lưu access_token vào data.

     

    Đầu tiên bạn cần kết nối thư viện và gọi Google_Client ra để bắt đàu phiên làm việc.

    require_once ( NV_ROOTDIR . "/modules/" . $module_file . "/Google/autoload.php" ); //ket noi thu vien
    
    //gọi class và chèn các thông số.
    $client = new Google_Client(); //
    
    $client->setClientId( $client_id );
    $client->setClientSecret( $client_secret );
    $client->setRedirectUri( $redirect_uri );
    $client->setAccessType( "offline" );
    $client->setApprovalPrompt('force');
    $client->setScopes( 'https://www.googleapis.com/auth/adsense.readonly', 'https://www.googleapis.com/auth/adsense' );

    Các thông số mình không đề cập sâu. Tuy nhiên bạn cần chú ý đến 2 thông số quan trọng:

     

    $client->setAccessType( "offline" ); $client->setApprovalPrompt('force');

     

    Không có 2 cái này thì Token bạn lấy được không thể sử dụng offline được.

     

    Tiếp theo, Lấy Tocken

        if( isset( $_GET['code'] ) ) //Link URI trả về nếu có biến code
    	{
    		$client->authenticate( $_GET['code'] ); //đưa vào $client để lấy Token
    		$_SESSION['access_token'] = $client->getAccessToken(); Lấy Token lưu vào Session để sử dụng.
    	}
    	else //nếu không có biến code, tiếp tục chạy lại URI đến khi nào láy đc thì thôi. Nếu vẫn không lấy đc trình duyệt sẽ trả về "Over requet".
    	{
    		$googleAuthUrl = $client->createAuthUrl();
    		Header( "Location: " . $googleAuthUrl );
    	}

    Khi Google chuyển sang cửa sổ xác thực, bạn chú ý phải có dòng 'Có quyền truy cập ngoại tuyến' như hình bên dưới: (4r không cho đăng ảnh).

     

    Đến đây chúng ta đã có access_token chính là $_SESSION['access_token'] nếu không làm gì nữa ta có thể sử dụng nó. Tuy nhiên để sử dụng được offline trong khuôn khổ bài viết này thì bạn cần có kết quả của access_token dạng cấu trúc:

    {"access_token":"ya29.Ci9AA5JgPVQ8RKpoLM-5UbViRyzK9aa1rjr4E6dJnQgu2mqaELCSpNqA","token_type":"Bearer","expires_in":3600,"refresh_token":"1\/8HwTLszfZFt0aoS43fftuTxUx_hldPY2G6ZoM","created":1471245021}

    Trong đó bắt buộc phải có refresh_token. Nếu cấu trúc không như thế này vui lòng kiểm tra lại từng bước bên trên hoặc comment bên dưới để đc trợ giúp.

     

    ----------------------------------------------------

    Đi cho hết chủ đề của bài viết mình hướng dẫn bước tiếp theo để lấy thông tin ADSense

    
    	if( isset( $_SESSION['access_token'] ) && $_SESSION['access_token'] )
    	{
    		$client->setAccessToken( $_SESSION['access_token'] ); //kiểm tra tồn tại access_token và đưa lại vào $client để sử dụng các dịch vụ
    	}
    	else
    	{
    		$authUrl = $client->createAuthUrl();
            Header( "Location: " . $authUrl ); // nếu không có access_token chuyển qua URI để thực hiện bước 1
    	}

     

    3) Gọi và sử dụng dịch vụ. Ở đây là Google_Service_AdSense

    $service = new Google_Service_AdSense( $client ); //gọi dịch vụ
    $AdSense_info = $service->accounts->listAccounts( 10000 ); //Lấy danh sách Accounts Adsense
    
    if( empty( $AdSense_info['items'] ) ) //không có danh sách trả về link lỗi
    {
        Header( "Location: " . NV_BASE_SITEURL . "index.php?" . NV_LANG_VARIABLE . "=" . NV_LANG_DATA . "&" . NV_NAME_VARIABLE . "=" . $module_name . "&" . NV_OP_VARIABLE . "=" . $op . "&err=1" );
        die;
    }
    $check_exist_save = false;
    
    foreach( $AdSense_info['items'] as $items ) duyệt qua danh sách Accounts Adsense để lưu lại
    {
    	// kiem tra trung
    	$check_exist = $db->query( "SELECT COUNT(*) FROM " . $db_config['prefix'] . "_" . $module_data . " WHERE accountsid =  " . $db->quote( $items['id'] ) . "" )->fetchColumn();
    
    	if( ! $check_exist )
    	{
    		$sql = "INSERT INTO `" . $db_config['prefix'] . "_" . $module_data . "` VALUES (
            	NULL,
                " . $user_info['userid'] . ",
                " . $db->quote( $items['name'] ) . ", 
                " . $db->quote( $items['id'] ) . ", 
                " . $db->quote( base64_encode( $_SESSION['access_token'] ) ) . ", 
                " . $db->quote( $items['creationTime'] ) . ", 
            	" . NV_CURRENTTIME . ",
                1
            )";
    		if( ! $db->insert_id( $sql, 'id' ) ) $check_err_save = true;
    	}
    	else
    	{
    		$check_exist_save = true;
    	}
    }

     

    Để tránh bị lỗi mình đã mã hóa base64 cho token trước khi lưu. (Cái này lúc trước mình có lưu không mã hóa trước khi lấy ra lại nó không hoạt động làm mò cả ngày trời mới biết lý do.)

     

    4) Sử dụng lại token đã lưu.

     

    Như bạn đã thấy tocken trả về ở trên có đoạn '"expires_in":3600' nghĩa là token này sẽ hết hạn sau 1h. Việc chúng ta là phải F5 lại cái token này để sửa dụng sau 1h đó.

     

    Đầu tiên bạn cung cần gọi kết nối lại thư viện và gọi Client ra để sử dụng

    require_once ( NV_ROOTDIR . "/modules/" . $module_file . "/Google/autoload.php" );
    
    $client = new Google_Client();
    $client->setClientId( $client_id );
    $client->setClientSecret( $client_secret );
    $client->setAccessType( "offline" );
    $client->setApprovalPrompt( 'force' );
    $client->setScopes( 'https://www.googleapis.com/auth/adsense.readonly', 'https://www.googleapis.com/auth/adsense' );

     

    Sau đó lấy token đã lưu trong dữ liệu ra để tạo lại token mới

    $client->setAccessToken( base64_decode( $data['access_token'] ) ); // giải mã base64 code đã mã hóa lưu vào data để tạo lại
    $refreshToken = $client->getRefreshToken(); // Lấy biến refresh_token. Thật ra chổ này bạn có thể dùng json_decode để lấy biến refresh_token cũng được.
    $newAccessToken = $client->refreshToken( $refreshToken ); //tạo token mới

    OK. var_dump( $client->getAccessToken() ). thì created sẽ là 1 giá trị thời gian mới. (Nếu thời gian giống như củ. Comment bên dưới).

     

    Việc tạo token mới đã xong rồi nhé. Không cần khách hàng hải xác thực lại chúng ta vẫn có thể vào tài khoản của họ như bình thường.

     

    Giờ thì sử dụng thôi. Ở đây mình muốn lấy báo cáo của Adsense đã lưu ở bước 3.

    $service = new Google_Service_AdSense( $client );
    
    $optParams = array(
    	'metric' => array(
    		'AD_REQUESTS',
    		'PAGE_VIEWS',
    		'AD_REQUESTS_COVERAGE',
    		'CLICKS',
    		'AD_REQUESTS_CTR',
    		'COST_PER_CLICK',
    		'AD_REQUESTS_RPM',
    		'EARNINGS' ),
    	'dimension' => 'DATE',
    	'sort' => '-DATE',
    	'filter' => array() );
    
    $report = $service->accounts_reports->generate( $data['accountsid'], $search['fromday'], $search['today'], $optParams );

    $data['accountsid']: ID của Adsense

    $search['fromday']: Thời gian báo cáo từ

    $search['today']: Đến

    $optParams: Các thông tin cần báo cáo.

     

    Tìm hiểu thêm?

     

    Duyệt mãng và xuất xHtml

    if( isset( $report ) && isset( $report['rows'] ) )
    {
    	// Display results.
    	foreach( $report['rows'] as $row )
    	{
            var_dump( $row );
    		$xtpl->assign( 'ROW', $row );
    		$xtpl->parse( 'main.data.loop' );
    	}
    
    	$xtpl->assign( 'TOTAL', $report['totals'] );
    	$xtpl->parse( 'main.data' );
    }
    else
    {
    	$xtpl->parse( 'main.empty' );
    }

    Chúc các bạn thành công.

     

    Bài viết này chỉ hướng dẫn để các bạn hiểu hoạt động của thư viện và cách lấy token offline, Không phải code chạy đầy đủ. Vì vậy đừng mong coppy nguyên bản đưa vào là nó chạy nhé. Vì còn nhiều thứ cấu hình khác nữa.

     

    Nếu có bạn nào quan tâm hoặc muốn hoàn thiện để chạy hoàn chỉnh, vui lòng commen bên dưới

     

     
    dangdinhtu thanhchunghti thích điều này.
  • thanhchunghti

    thanhchunghti Lê Thành Chung

Chia sẻ trang này

Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây