jacobkiers/oauth
OAuth 1 PHP library based on Andy Smith’s original implementation, forked via EHER. Includes request token support (reported working), with other flows not fully tested yet. Travis CI-enabled; suitable for experimenting with OAuth 1 signing and requests.
Installation Add the package via Composer:
composer require jacobkiers/oauth
Ensure your composer.json includes:
"require": {
"jacobkiers/oauth": "^1.0"
}
Basic Initialization
Create a service class to wrap the OAuth client (e.g., app/Services/OAuthService.php):
namespace App\Services;
use OAuth\OAuth1\Service\Consumer;
use OAuth\OAuth1\Token\Token;
class OAuthService extends Consumer
{
public function __construct(string $consumerKey, string $consumerSecret, string $callbackUrl)
{
parent::__construct($consumerKey, $consumerSecret, $callbackUrl);
}
public function getRequestToken(): Token
{
return $this->getRequestToken();
}
public function getAccessToken(Token $requestToken, string $verifier): Token
{
return $this->getAccessToken($requestToken, $verifier);
}
}
First Use Case: Request Token
Register the service in AppServiceProvider:
public function register()
{
$this->app->singleton('oauth', function ($app) {
return new OAuthService(
config('services.twitter.key'),
config('services.twitter.secret'),
url('/oauth/callback')
);
});
}
Use it in a controller:
use Illuminate\Support\Facades\Redirect;
public function requestToken()
{
$token = app('oauth')->getRequestToken();
session(['oauth_token' => $token->key, 'oauth_token_secret' => $token->secret]);
return Redirect::to($token->getAuthorizationUrl());
}
Request Token and Redirect
public function requestToken()
{
$oauth = app('oauth');
$token = $oauth->getRequestToken();
session(['oauth_token' => $token->key, 'oauth_token_secret' => $token->secret]);
return Redirect::to($token->getAuthorizationUrl());
}
Handle Callback
public function handleCallback(Request $request)
{
$oauth = app('oauth');
$token = new Token(
session('oauth_token'),
session('oauth_token_secret')
);
$accessToken = $oauth->getAccessToken($token, $request->oauth_verifier);
session(['access_token' => $accessToken->key, 'access_token_secret' => $accessToken->secret]);
return redirect('/dashboard');
}
Protected API Requests
public function fetchProtectedData()
{
$oauth = app('oauth');
$token = new Token(
session('access_token'),
session('access_token_secret')
);
$response = $oauth->request('/protected/resource', $token, 'GET');
return json_decode($response->getBody(), true);
}
Middleware for Token Management Create middleware to attach tokens to requests:
namespace App\Http\Middleware;
use Closure;
use OAuth\OAuth1\Token\Token;
class OAuthTokenMiddleware
{
public function handle($request, Closure $next)
{
if ($request->has('oauth_token') && $request->has('oauth_token_secret')) {
$request->merge([
'oauth_token' => new Token(
$request->oauth_token,
$request->oauth_token_secret
)
]);
}
return $next($request);
}
}
Register in app/Http/Kernel.php:
protected $middleware = [
// ...
\App\Http\Middleware\OAuthTokenMiddleware::class,
];
Database Storage Use Eloquent models to persist tokens:
// Migration
Schema::create('oauth_tokens', function (Blueprint $table) {
$table->id();
$table->string('token');
$table->string('token_secret');
$table->string('user_id')->nullable();
$table->timestamps();
});
// Model
class OAuthToken extends Model
{
protected $fillable = ['token', 'token_secret', 'user_id'];
}
Configuration
Store credentials in config/services.php:
'twitter' => [
'key' => env('TWITTER_KEY'),
'secret' => env('TWITTER_SECRET'),
],
Session Management
$_GET/$_POST data. Laravel’s Request object may require manual parsing for OAuth parameters.PHP Version Incompatibility
strict_types=1).No Built-in CSRF Protection
VerifyCsrfToken middleware alongside OAuth flows.Token Storage
Error Handling
try {
$token = $oauth->getRequestToken();
} catch (\Exception $e) {
Log::error("OAuth Error: " . $e->getMessage());
abort(500, "OAuth request failed");
}
Enable Verbose Logging Configure the OAuth client to log requests/responses:
$oauth = new OAuthService($key, $secret, $callbackUrl);
$oauth->setDebug(true); // Enable debug mode
Inspect Raw Requests
Use Laravel’s tap to debug HTTP requests:
$response = $oauth->request('/endpoint', $token, 'GET')->tap(function ($response) {
Log::debug("Response: " . $response->getBody());
});
Test with a Mock Provider Use a local OAuth 1.0a test server (e.g., oauth-1.0a-server) to avoid rate limits or API changes.
Custom Signature Methods
Extend the OAuth\OAuth1\Token\SignatureMethod class to support additional algorithms:
class CustomSignatureMethod extends \OAuth\OAuth1\Token\SignatureMethod\HMAC_SHA1
{
public function sign($data, $key)
{
// Custom logic
}
}
Laravel Facade Create a facade for cleaner syntax:
// app/OAuth.php
namespace App;
use Illuminate\Support\Facades\Facade;
class OAuth extends Facade
{
protected static function getFacadeAccessor() { return 'oauth'; }
}
Usage:
$token = OAuth::getRequestToken();
Event Listeners
Dispatch events for OAuth flow steps (e.g., OAuthTokenRequested, OAuthTokenExchanged):
event(new OAuthTokenRequested($token));
cURL Options
The package uses curl_setopt directly. Laravel’s Http client may override these. Ensure compatibility:
$oauth->setCurlOptions([
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
]);
URL Encoding
The package may not handle URL encoding consistently. Use Laravel’s Str::of($url)->urlencode() for safety.
Timeouts Set reasonable timeouts to avoid hanging requests:
$oauth->setCurlOptions([
CURLOPT_TIMEOUT => 30,
CURLOPT_CONNECTTIMEOUT => 10,
]);
How can I help you explore Laravel packages today?