I'm writing a tiny sms gateway to be consumed by a couple of projects,
I implemented laravel passport authentication (client credentials grant token)
Then I've added CheckClientCredentials
to api middleware group:
protected $middlewareGroups = [
'web' => [
...
],
'api' => [
'throttle:60,1',
'bindings',
\Laravel\Passport\Http\Middleware\CheckClientCredentials::class
],
];
The logic is working fine, now in my controller I need to get client associated with a valid token.
routes.php
Route::post('/sms', function(Request $request) {
// save the sms along with the client id and send it
$client_id = ''; // get the client id somehow
sendSms($request->text, $request->to, $client_id);
});
For obvious security reasons I can never send the client id with the consumer request e.g. $client_id = $request->client_id;
.
put above to your middleware file, then you can access client_id by
request()->oauth_client_id
I use this, to access the authenticated client app...
Source
There is a tricky method. You can modify the method of handle in the middleware CheckClientCredentials, just add this line.
Then you can get client_id in controller's function:
So, no answers ...
I was able to resolve the issue by consuming my own API, finally I came up with simpler authentication flow, the client need to send their id & secret with each request, then I consumed my own
/oauth/token
route with the sent credentials, inspired by Esben Petersen blog post.Once the access token is generated, I append it to the headers of
Symfony\Request
instance which is under processing.My final output like this:
I used the above middleware in conjunction with Passport's
CheckClientCredentials
.This way, I was able to insure that
$request->input('client_id')
is reliable and can't be faked.The OAuth token and client information are stored as a protected variable in the Laravel\Passport\HasApiTokens trait (which you add to your User model).
So simply add a getter method to your User model to expose the OAuth information:
This will return an Eloquent model for the oauth_clients table
I dug into CheckClientCredentials class and extracted what I needed to get the
client_id
from the token.aud
claim is where theclient_id
is stored.Few places to refactor this to in order to easily access but that will be up to your application