# Socialite Providers Manager

[![Build Status](https://travis-ci.org/SocialiteProviders/Manager.svg)](https://travis-ci.org/SocialiteProviders/Manager)
[![codecov](https://codecov.io/gh/SocialiteProviders/Manager/branch/master/graph/badge.svg)](https://codecov.io/gh/SocialiteProviders/Manager)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/SocialiteProviders/Manager/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/SocialiteProviders/Manager/?branch=master) 
[![Latest Stable Version](https://poser.pugx.org/socialiteproviders/manager/v/stable.svg)](https://packagist.org/packages/socialiteproviders/manager) 
[![Total Downloads](https://poser.pugx.org/socialiteproviders/manager/downloads.svg)](https://packagist.org/packages/socialiteproviders/manager) 
[![Latest Unstable Version](https://poser.pugx.org/socialiteproviders/manager/v/unstable.svg)](https://packagist.org/packages/socialiteproviders/manager) 
[![License](https://poser.pugx.org/socialiteproviders/manager/license.svg)](https://packagist.org/packages/socialiteproviders/manager)
[![StyleCI](https://github.styleci.io/repos/30993504/shield?branch=master)](https://github.styleci.io/repos/30993504?branch=master)
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/ddb2f0df-6d85-431c-8e68-6164b08dd852/small.png)](https://insight.sensiolabs.com/projects/ddb2f0df-6d85-431c-8e68-6164b08dd852)

## About

A package for Laravel Socialite that allows you to easily add new providers or override current providers.  
  
### Benefits

* You will have access to all of the providers that you load in using the manager.
* Instantiation is deferred until Socialite is called
* You can override current providers
* You can create new providers
* Lumen usage is easy
* `stateless()` can be set to `true` or `false`
* You can override a config dynamically
* It retrieves environment variables directly from the `.env` file instead of also having to configure the services array.

## Available Providers

* See the [SocialiteProviders](https://socialiteproviders.com/) list
* You can also make your own or modify someone else's


## Reference

* [Laravel docs about events](https://laravel.com/docs/7.x/events)
* [Laracasts video on events in Laravel 5](https://laracasts.com/lessons/laravel-5-events)
* [Laravel Socialite Docs](https://github.com/laravel/socialite)  
* [Laracasts Socialite video](https://laracasts.com/series/whats-new-in-laravel-5/episodes/9)


## Creating a Handler

Below is an example handler.  You need to add this full class name to the `listen[]` in the `EventServiceProvider`.

* [See also the Laravel docs about events](https://laravel.com/docs/7.x/events).
* `providername` is the name of the provider such as `meetup`.
* You will need to change your the namespacing and class names of course.  


```php
namespace Your\Name\Space;

use SocialiteProviders\Manager\SocialiteWasCalled;

class ProviderNameExtendSocialite
{
    public function handle(SocialiteWasCalled $socialiteWasCalled)
    {
        $socialiteWasCalled->extendSocialite('providername', \Your\Name\Space\Provider::class);
    }
}
```


## Creating a Provider

* Look at the already created [providers](https://socialiteproviders.netlify.app/) for inspiration.
* [See this article on Medium](https://medium.com/@morrislaptop/adding-auth-providers-to-laravel-socialite-ca0335929e42)

## Overriding a Built-in Provider

You can easily override a built-in `laravel/socialite` provider by creating a new one with exactly the same name (i.e. 'facebook').


## Dynamically Passing a Config

You can dynamically pass a config by using:

```php
$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('provider-name')->setConfig($config)->redirect();
```

**You must call this before you run any Socialite methods.**


## Creating an OAuth1 Server Class

Take a look at the other [OAuth1 providers](https://socialiteproviders.netlify.app/) for inspiration. 

## Getting the Access Token Response Body

Laravel Socialite by default only allows access to the `access_token`.  Which can be accessed 
via the `\Laravel\Socialite\User->token` public property.  Sometimes you need access to the whole response body which
may contain items such as a `refresh_token`.  

To make this possible, the OAuth2 provider class needs to extend `\SocialiteProviders\Manager\OAuth2\AbstractProvider` and 
OAuth1 providers need to utilize the `\SocialiteProviders\Manager\OAuth1\AbstractProvider` and `\SocialiteProviders\Manager\OAuth1\Server`.

You can access it from the user object like so: `$user->accessTokenResponseBody`
