Microsoft Graph OAuth2 Provider for Laravel Socialite
Inspired by https://github.com/SocialiteProviders/Microsoft-Azure, (*1)
Documentation
INSTALLATION
1. COMPOSER
This assumes that you have composer installed globally, (*2)
composer require knox2/msgraph
, (*3)
2. SERVICE PROVIDER
Remove Laravel\Socialite\SocialiteServiceProvider from your providers[] array in config\app.php if you have added it already., (*4)
Add \SocialiteProviders\Manager\ServiceProvider::class to your providers[] array in config\app.php., (*5)
For example:, (*6)
'providers' => [
// remove 'Laravel\Socialite\SocialiteServiceProvider',
\SocialiteProviders\Manager\ServiceProvider::class, // add
];
Note: If you would like to use the Socialite Facade, you need to install it., (*7)
3. ADD THE EVENT AND LISTENERS
Add SocialiteProviders\Manager\SocialiteWasCalled event to your listen[] array in /Providers/EventServiceProvider., (*8)
Add your listeners (i.e. the ones from the providers) to the SocialiteProviders\Manager\SocialiteWasCalled[] that you just created., (*9)
The listener that you add for this provider is, (*10)
'Knox\MSGraph\MSGraphExtendSocialite@handle'
Note: You do not need to add anything for the built-in socialite providers unless you override them with your own providers., (*11)
For example:, (*12)
/**
* The event handler mappings for the application.
*
* @var array
*/
protected $listen = [
\SocialiteProviders\Manager\SocialiteWasCalled::class => [
'Knox\MSGraph\MSGraphExtendSocialite@handle',
],
];
4. ENVIRONMENT VARIABLES
add environment values to your .env, (*13)
// other values above
MSGRAPH_KEY=yourkeyfortheservice
MSGRAPH_SECRET=yoursecretfortheservice
MSGRAPH_REDIRECT_URI=https://example.com/login
add to config/services.php, (*14)
'msgraph' => [
'client_id' => env('MSGRAPH_KEY'),
'client_secret' => env('MSGRAPH_SECRET'),
'redirect' => env('MSGRAPH_REDIRECT_URI'),
],
REFERENCE
USAGE
You should now be able to use it like you would regularly use Socialite (assuming you have the facade installed):, (*15)
return Socialite::with('msgraph')->redirect();
LUMEN SUPPORT
You can use Socialite providers with Lumen. Just make sure that you have facade support turned on and that you follow the setup directions properly., (*16)
Note: If you are using this with Lumen, all providers will automatically be stateless since Lumen does not keep track of state., (*17)
Also, configs cannot be parsed from the services[] in Lumen. You can only set the values in the .env file as shown exactly in this document. If needed, you can also override a config (shown below)., (*18)
STATELESS
You can set whether or not you want to use the provider as stateless. Remember that the OAuth provider (Twitter, Tumblr, etc) must support whatever option you choose.
Note: If you are using this with Lumen, all providers will automatically be stateless since Lumen does not keep track of state., (*19)
to turn off stateless, (*20)
return Socialite::with('msgraph')->stateless(false)->redirect();
to use stateless, (*21)
return Socialite::with('msgraph')->stateless()->redirect();
OVERRIDING A CONFIG
If you need to override the providerâs environment or config variables dynamically anywhere in your application, you may use the following:, (*22)
$clientId = "secret";
$clientSecret = "secret";
$redirectUrl = "http://yourdomain.com/api/redirect";
$additionalProviderConfig = ['site' => 'meta.stackoverflow.com'];
$config = new \SocialiteProviders\Manager\Config($clientId, $clientSecret, $redirectUrl, $additionalProviderConfig);
return Socialite::with('msgraph')->setConfig($config)->redirect();
RETRIEVING THE ACCESS TOKEN RESPONSE BODY
Laravel Socialite by default only allows access to the access_token. Which can be accessed via the, (*23)
\Laravel\Socialite\User->token
, (*24)
public property. Sometimes you need access to the whole response body which may contain items such as a refresh_token., (*25)
You can get the access token response body, after you called the user() method in Socialite, by accessing the property
$user->accessTokenResponseBody
, (*26)
$user = Socialite::driver('msgraph')->user();
$accessTokenResponseBody = $user->accessTokenResponseBody;