Use Sina Weibo OAuth 2.0 Authorize in Laravel

Signin Sina Weibo Open Platform, get App Key and App Secret, reference PHP SDK. The main principle is after authority on Sina Weibo, store uid, access_token and other information in local database. Determine the access_token at user next signin.

Create users table

I prefer use migration, run in terminal:

$ php artisan migrate:make create_users_table

File: app/database/migrations/2014_07_17_0000_create_users_table.php

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('email');
            $table->string('password');
            $table->string('username', 60)->nullable();
            // ...
            $table->timestamp('deleted_at')->nullable();
            $table->timestamp('activated_at')->nullable();
            $table->timestamp('signin_at')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }

}

Download and extracting PHP SDK, rename floder as api and place at app/api

├── app
│   ├── api
│   │   ├── callback.php
│   │   ├── config.php
│   │   ├── index.php
│   │   ├── saetv2.ex.class.php
│   │   └── weibolist.php
│   ├── commands
│   ├── config
│   ├── controllers
│   ├── database
│   ├── lang
│   ├── ...
├── bootstrap
├── public
├── readme
├── vendor
├── ...
...

File: app/api/config.php

Fill in your App Key, App Secret and set callback url.

<?php
header('Content-Type: text/html; charset=UTF-8');

define( "WB_AKEY" , 'xxxxxxxxxx' );
define( "WB_SKEY" , 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' );
define( "WB_CALLBACK_URL" , route('oauth-signup') );

File: route.php

// ...

/*
|--------------------------------------------------------------------------
| Basic Competence (Signin and Signup Routes)
|--------------------------------------------------------------------------
|
*/

Route::group(array('prefix' => 'auth'), function () {
    $Authority = '[email protected]';
    // ...
    # Route Group
    Route::group(array('before' => 'guest'), function () use ($Authority) {
        // ...
        # Oauth Signup
        Route::get('oauth-signup' , array('as' => 'oauth-signup'  , 'uses' => $Authority.'getOauthSignup'   ));
        # Oauth Success
        Route::get('oauth-success', array('as' => 'oauth-success' , 'uses' => $Authority.'getOauthSuccess', 'before' => 'auth'  ));
        // ...
    });
});
// ...

File: AuthorityController.php

// ...

/**
 * Action:Oauth 2.0 Signup
 * @return Response
 */
public function getOauthSignup()
{
    header("Content-type:text/html;charset=utf-8");
    session_start();

    include_once( app_path('api/config.php') );
    include_once( app_path('api/saetv2.ex.class.php') );

    $o = new SaeTOAuthV2( WB_AKEY , WB_SKEY );

    if (isset($_REQUEST['code'])) {
        $keys                 = array();
        $keys['code']         = $_REQUEST['code'];
        $keys['redirect_uri'] = WB_CALLBACK_URL;
        try {
            $token = $o->getAccessToken( 'code', $keys ) ;
        } catch (OAuthException $e) {
        }
    }

    if ($token) {
        $_SESSION['token'] = $token;
        setcookie( 'weibojs_'.$o->client_id, http_build_query($token) );

        $c            = new SaeTClientV2( WB_AKEY , WB_SKEY , $_SESSION['token']['access_token'] );
        $ms           = $c->home_timeline(); // Done
        $uid_get      = $c->get_uid();
        $uid          = $uid_get['uid'];
        $user_message = $c->show_user_by_id($uid);// Get user info by UID
        $nickname     = $user_message['screen_name'];
        $password     = $_SESSION['token']['access_token'];
        $credentials  = array('email' => $uid, 'password' => $password);

        if (Auth::attempt($credentials))
        {
            // Signin Success
            return Redirect::intended();
        } else {
            $user           = new User;
            $user->email    = $uid;
            $user->password = $_SESSION['token']['access_token'];
            $user->nickname = $nickname;
            $user->save();
            return View::make('authority.oauthSuccess');
        }

    } else {
       return View::make('signup')
        ->withErrors(array('add' => 'Signup Fail'));;
    }

}

/**
 * View: Oauth Success
 * @param  string
 * @return Response
 */
public function getOauthSuccess()
{
    return View::make('authority.oauthSuccess');
}
// ...

File: app/views/authority/signup.blade.php

<?php
header("Content-type:text/html;charset=utf-8");
session_start();

include_once( app_path('api/config.php') );
include_once( app_path('api/saetv2.ex.class.php') );
$o = new SaeTOAuthV2( WB_AKEY , WB_SKEY );
$code_url = $o->getAuthorizeURL( WB_CALLBACK_URL );

?>
// ...
<a href="<?php echo $code_url ?>">
    <button type="button">
        <i class="fa fa-weibo fa-2x"></i>Connect Sina Weibo
    </button>
</a>
// ...

File: app/views/authority/oauthSuccess.blade.php

<?php
header("Content-type:text/html;charset=utf-8");

include_once( app_path('api/config.php') );
include_once( app_path('api/saetv2.ex.class.php') );
$o = new SaeTOAuthV2( WB_AKEY , WB_SKEY );
$code_url = $o->getAuthorizeURL( WB_CALLBACK_URL );

?>

// ...

<p class="center">Authorization Successful</p>
<p>
    <a href="<?php echo $code_url ?>">
        <button type="button">
            <i class="fa fa-weibo fa-2x"></i>
            Login with your Weibo account
        </button>
    </a>
</p>

// ...

Result

Use Sina Weibo Oauth 2.0 Authorize in Laravel

Issues

ErrorException
Undefined variable: token

Only can signin with your own account, if you encounter this situation, try signin Sina Weibo Open Platform → Management Center → My Wesite → Click your website → Website Information → Test Account → Association Test Account.

Notice: curl_setopt(): CURLOPT_SSL_VERIFYHOST no longer accepts the value 1, value 2 will be used instead in saetv2.ex.class.php on line 357

Open saetv2.ex.class.php, comment out the code about line 356.

curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 1);

Install Curl on Ubuntu Server

$ sudo apt-get install php5-curl

After install, don't forgot restart/reload web service.

Related Links Use Tencent QQ API in Laravel

I hope you like this tutorial. Share this tutorials on your favorite media to show your appreciation. Thanks!

0.00 avg. rating (0% score) - 0 votes