I am using Google OAuth API to create a login system and fetching youtube channel data in Wordpress. I have done to get channel data and email id also get access_token, token_type, expires_in, refresh_token and id_token but I have no idea how to achieve login system in Wordpress can anyone guide me how to do that and also let me know my below code is correct or can be shorten.


$client_id = 'xxxxxxxxxxxxxxxxxxx';
$client_secret = 'xxxxxxxxxxxxxxx';
$redirect_uri = 'http://localhost/mysite/oauth2callback';
$code = $_GET["code"];

$oauth2token_url = "https://accounts.google.com/o/oauth2/token";
$clienttoken_post = array(
        "code" => $code,
        "client_id" => $client_id,
        "client_secret" => $client_secret,
        "redirect_uri" => $redirect_uri,
        "grant_type" => "authorization_code"

$curl = curl_init($oauth2token_url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $clienttoken_post);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  

$json_response = curl_exec($curl); 
$authObj = json_decode($json_response);
$access_token = $authObj->access_token;
$token_type = $authObj->token_type;
$expires_in = $authObj->expires_in;
$refresh_token = $authObj->refresh_token;
$Id_token = $authObj->id_token;

$_SESSION['access_token'] = $access_token;  

//getting the email id
$email_url = 'https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token='.$_SESSION['access_token'];
$em = curl_init();
curl_setopt( $em, CURLOPT_URL, $email_url );
curl_setopt($em, CURLOPT_HEADER, 0);    
curl_setopt( $em, CURLOPT_RETURNTRANSFER, 1 );
$eamilOBJ = json_decode( curl_exec( $em ) );
$email = $eamilOBJ->email;

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {        
    $url = 'https://www.googleapis.com/youtube/v3/channels?fields=items(id,snippet(title,description,customUrl,thumbnails(default)),statistics(viewCount,subscriberCount))&part=snippet%2Cstatistics&mine=true&access_token='.$_SESSION['access_token'];

    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt($ch, CURLOPT_HEADER, 0);    
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    $channelOBJ = json_decode( curl_exec( $ch ) );

    $channel_id = $channelOBJ->items[0]->id;
    $thumbnail_url = $channelOBJ->items[0]->snippet->thumbnails->default->url;
    $youtubetitle = $channelOBJ->items[0]->snippet->title;
    $description = $channelOBJ->items[0]->snippet->description;
    $total_subscriber = $channelOBJ->items[0]->statistics->subscriberCount;

    echo 'Email ID : '.$email;
    echo 'Image: URL: '.$thumbnail_url;
    echo 'Channel Title: '.$youtubetitle;
    echo 'Total Subscriber: '.$total_subscriber;    
    echo '<a href="https://accounts.google.com/o/oauth2/auth?
        <button class="loginBtn loginBtn--google">Sign in with Google</button></a>';

Best practice and shorten the code you can write WordPress-based code, So when it comes to making GET requests for WordPress, the function that we have available to us is wp_remote_get and for POST requests wp_remote_post. There is also another WP function available to retrieve body, headers etc


I'm also working on plugin which uses google oAuth and YouTube data API. The functionality works on backend, admin logs in just once using his gmail credentials and then with use of refresh_token we can keep him logged in.

Keep in mind the refresh token is generated only the first time you give access to your app. You have to clear your permissions to fetch it again.

I used PHP and not javascript, but still here is my complete function to give you a brief idea

public function uty_main_page(){
    require_once ('config.php');
    global $wpdb;
    if(isset($_GET['code'])) {
        $_SESSION['token'] = $client->getAccessToken();
        $token_decode = json_decode($_SESSION['token']);
        update_option( 'uty_refresh_token' , $token_decode->refresh_token );
        echo 'Authorization Successful';
                    <?php if(get_option( 'uty_refresh_token' ) != ''){ ?>
                        <li><a href="#uty_upload">Upload</a></li>
                        <li><a href="#uty_videos">All Videos</a></li>
                    <?php } ?>
                    <li><a href="#uty_settings">Settings</a></li>
            <div class="tab_content">
                <?php if( $client->isAccessTokenExpired() ) { ?>
                    <?php if(get_option( 'uty_refresh_token' ) != ''){ ?>
                        $client->refreshToken( get_option( 'uty_refresh_token' ) );
                        $_SESSION['token'] = $client->getAccessToken();
                        <div id="uty_upload">
                                    $uploaded = media_handle_upload('uty_video', 0);
                                        $message = $uploaded->get_error_message();
                                            //Do Some coding here
                    <?php } ?>
                <?php } ?>
                <div id="uty_settings">
                    <?php if(isset($_POST['revoke-access-token'])){ ?>
                        <?php update_option( 'uty_refresh_token' , '' ); ?>
                        <?php update_option( 'uty_google_client_api' , '' ); ?>
                        <?php update_option( 'uty_google_client_id' , '' ); ?>
                        <?php update_option( 'uty_google_client_secret' , '' ); ?>
                        <?php update_option( 'uty_youtube_channel' , '' ); ?>
                    <?php } ?>
                    <h3>Please enter the below details to kick start your Youtube uploads</h3>

                    <?php if( !empty(get_option('uty_google_client_api')) && !empty(get_option('uty_google_client_id')) && !empty(get_option('uty_google_client_secret')) && empty(get_option('uty_refresh_token')) ){ ?>
                            <?php $state = mt_rand(); ?>
                            <?php $client->setState($state); ?>
                            <?php $_SESSION['state'] = $state; ?>
                            <?php $authUrl = $client->createAuthUrl(); ?>
                            <a href="<?php echo $authUrl; ?>">Click here to authorize your credentials</a>
                    <?php } elseif( !empty(get_option('uty_google_client_api')) && !empty(get_option('uty_google_client_id')) && !empty(get_option('uty_google_client_secret')) && !empty(get_option('uty_refresh_token')) ){ ?>

                    <?php } ?>
<?php } ?>

In the above function the main thing i've done is to store refresh_token when user logs in first time and then pass it in function to get new access token every time.

$client->refreshToken( get_option( 'uty_refresh_token' ) );
$_SESSION['token'] = $client->getAccessToken();

These three lines does the work of getting new access token every time. Hope this helps you

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.