Setting up a PHP OAuth Client
Our firm usually recommends PHPLeague’s OAuth2 client for PHP integrations. There’s is sample code in the README.md, but basically
- Include the relevant Client Key and Secret in the
$Provider
element, i.e.
$provider = new \League\OAuth2\Client\Provider\GenericProvider([
'clientId' => 'fake-id-741648bdf4e3ffc8e1e3607898e16870',
'clientSecret' => 'fake-secret-548755e9e3717974f7a378cd25b24e85',
'redirectUri' => 'https://app.example.com/callback.php',
'urlAuthorize' => 'https://oauth.server.com/oauth2/authz/',
'urlAccessToken' => 'https://oauth.server.com/oauth2/access/',
'urlResourceOwnerDetails' => 'https://oauth.server.com/userinfo/',
]);
- Make the call to getAuthorizationURL() with the
$Provider
, which will redirect the user to the login page, and return back to your code with?code=[stuff]
. To include OIDC support, make sure you specify the OIDC scope (as well as any others that you care about):
$options = [
'scope' => ['openid profile email']
];
and call getAuthorizationUrl
with the $options array, like:
$authorizationUrl = $provider->getAuthorizationUrl($options);
- You can then use the value in
$_GET['code']
to get an access token from the identity provider, like:
$accessToken = $provider->getAccessToken('authorization_code', [
'code' => $_GET['code']
]);
- using that token you’ll be able to use
getAuthenticatedRequest
‘s along with the$accessToken
as needed if you need to pull something from a secured API on the identity server:
$request = $provider->getAuthenticatedRequest(
'GET',
'https://oauth.server.com/some-api-endpoint',
$accessToken
);
$entitlementResponse = $provider->getParsedResponse($request);
- you can also just user information about the
$resourceOwner
that is returned (because of the scopes that we chose:
$resourceOwner = $provider->getResourceOwner($accessToken)->toArray();
The access token has expiry information, etc. and there are functions for refreshing the token as needed. All in all it’s really simple to do with PHP.
I avoid JS for OAuth, but I’m pretty sure that’s just a personal preference. There are good javascript libraries as well.
Note: Loosely based off of this StackOverflow answer from the author.