Socialite — это инструмент аутентификации OAuth2. Он вдохновлен laravel/socialite, и вы можете легко использовать его в любом проекте PHP. английский документ
Теперь инструмент поддерживает следующие платформы: Facebook, Github, Google, Linkedin, Outlook, QQ, TAPD, Alipay, Taobao, Baidu, DingTalk, Weibo, WeChat, Douyin, Feishu, Lark, Douban, Enterprise WeChat, Tencent Cloud, Line, Гите, Кодирование.
Если вам нравятся мои проекты и вы хотите меня поддержать, нажмите сюда ❤️
PHP >= 8.0.2
composer require " overtrue/socialite " -vvv
Пользователям нужно только создать соответствующие переменные конфигурации, затем использовать инструменты для создания приложений аутентификации для каждой платформы и легко получить access_token платформы и информацию, связанную с пользователем. Подробную информацию о логике реализации инструмента см. в документах OAuth2 каждой основной платформы.
Использование инструмента условно разделено на следующие этапы:
Более удобный пакет интеграции, созданный для пользователей Laravel: overtrue/laravel-socialite
authorize.php
: позволяет пользователю перейти к аутентификации платформы.
<?php
use Overtrue Socialite SocialiteManager ;
$ config = [
' github ' => [
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
];
$ socialite = new SocialiteManager ( $ config );
$ url = $ socialite -> create ( ' github ' )-> redirect ();
return redirect ( $ url );
callback.php
:
<?php
use Overtrue Socialite SocialiteManager ;
$ config = [
' github ' => [
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
];
$ socialite = new SocialiteManager ( $ config );
$ code = request ()-> query ( ' code ' );
$ user = $ socialite -> create ( ' github ' )-> userFromCode ( $ code );
$ user -> getId (); // 1472352
$ user -> getNickname (); // "overtrue"
$ user -> getUsername (); // "overtrue"
$ user -> getName (); // "安正超"
$ user -> getEmail (); // "[email protected]"
. . .
Он работает «из коробки», устанавливая одни и те же пары ключ-значение для каждой платформы: client_id
, client_secret
, redirect
.
Пример:
$ config = [
' weibo ' => [
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
' facebook ' => [
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
];
Вы можете назвать каждую платформу любым именем, например foo
. После использования метода alias вам необходимо установить в конфигурации дополнительный ключ provider
, чтобы сообщить инструментарию, как правильно найти нужную вам программу:
$ config = [
// 为 github 应用起别名为 foo
' foo ' => [
' provider ' => ' github ' , // <-- provider name
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
// 另外一个名字叫做 bar 的 github 应用
' bar ' => [
' provider ' => ' github ' , // <-- provider name
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
//...
];
$ socialite = new SocialiteManager ( $ config );
$ appFoo = $ socialite -> create ( ' foo ' );
$ appBar = $ socialite -> create ( ' bar ' );
Вы можете легко создавать приложения от пользовательских поставщиков услуг, следуя этим двум пунктам:
Использовать собственный создатель
Как показано в следующем коде, имя поставщика услуг определено для приложения foo, но сам инструмент еще не поддерживает его, поэтому создатель extend()
используется для создания экземпляра поставщика услуг в форме замыкания. функция.
$ config = [
' foo ' => [
' provider ' => ' myprovider ' , // <-- 一个工具还未支持的服务提供程序
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
];
$ socialite = new SocialiteManager ( $ config );
$ socialite -> extend ( ' myprovider ' , function ( array $ config ) {
return new MyCustomProvider ( $ config );
});
$ app = $ socialite -> create ( ' foo ' );
Важный
? Ваш собственный класс поставщика услуг должен реализовывать интерфейс OvertrueSocialiteContractsProviderInterface
class MyCustomProvider implements Overtrue Socialite Contracts ProviderInterface
{
//...
}
Затем установите имя класса для provider
, чтобы инструменты могли найти класс и создать его экземпляр:
$ config = [
' foo ' => [
' provider ' => MyCustomProvider::class, // <-- 类名
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
];
$ socialite = new SocialiteManager ( $ config );
$ app = $ socialite -> create ( ' foo ' );
На разных платформах используются разные методы настройки. Чтобы обеспечить нормальную работу инструмента, убедитесь, что конфигурация используемой вами платформы установлена правильно.
Пожалуйста, настройте следующим образом
$ config = [
' alipay ' => [
// 这个键名还能像官方文档那样叫做 'app_id'
' client_id ' => ' your-app-id ' ,
// 请根据官方文档,在官方管理后台配置 RSA2
// 注意: 这是你自己的私钥
// 注意: 不允许私钥内容有其他字符
// 建议: 为了保证安全,你可以将文本信息从磁盘文件中读取,而不是在这里明文
' rsa_private_key ' => ' your-rsa-private-key ' ,
// 确保这里的值与你在服务后台绑定的地址值一致
// 这个键名还能像官方文档那样叫做 'redirect_url'
' redirect ' => ' http://localhost/socialite/callback.php ' ,
// 沙箱模式接入地址见 https://opendocs.alipay.com/open/220/105337#%E5%85%B3%E4%BA%8E%E6%B2%99%E7%AE%B1
' sandbox ' => false ,
]
. . .
];
$ socialite = new SocialiteManager ( $ config );
$ user = $ socialite -> create ( ' alipay ' )-> userFromCode ( ' here is auth code ' );
// 详见文档后面 "User interface"
$ user -> getId (); // 1472352
$ user -> getNickname (); // "overtrue"
$ user -> getUsername (); // "overtrue"
$ user -> getName (); // "安正超"
. . .
В настоящее время этот инструмент поддерживает только метод аутентификации личного закрытого ключа RSA2.
Как показывает документация
Примечание. Этот инструмент поддерживает только QR-код для подключения к сторонним веб-сайтам для получения информации о пользователе (opeid, UnionID и псевдоним).
$ config = [
' dingtalk ' => [
// or 'app_id'
' client_id ' => ' your app id ' ,
// or 'app_secret'
' client_secret ' => ' your app secret ' ,
// or 'redirect_url'
' redirect ' => ' redirect URL '
]
];
$ socialite = new SocialiteManager ( $ config );
$ user = $ socialite -> create ( ' dingtalk ' )-> userFromCode ( ' here is auth code ' );
// 详见文档后面 "User interface"
$ user -> getId (); // 1472352
$ user -> getNickname (); // "overtrue"
$ user -> getUsername (); // "overtrue"
$ user -> getName (); // "安正超"
. . .
Примечание. Если при использовании службы Douyin вы хотите напрямую использовать access_token для получения информации о пользователе, сначала установите openid. Сначала вызовите
withOpenId()
, а затемuserFromToken()
$ config = [
' douyin ' => [
' client_id ' => ' your app id ' ,
' client_secret ' => ' your app secret ' ,
' redirect ' => ' redirect URL '
]
];
$ socialite = new SocialiteManager ( $ config );
$ user = $ socialite -> create ( ' douyin ' )-> userFromCode ( ' here is auth code ' );
$ user = $ socialite -> create ( ' douyin ' )-> withOpenId ( ' openId ' )-> userFromToken ( ' here is the access token ' );
Примечание. Если при использовании службы
头条
вы хотите напрямую использовать access_token для получения информации о пользователе, сначала установите openid. Сначала вызовитеwithOpenId()
, а затемuserFromToken()
$ config = [
' toutiao ' => [
' client_id ' => ' your app id ' ,
' client_secret ' => ' your app secret ' ,
' redirect ' => ' redirect URL '
]
];
$ socialite = new SocialiteManager ( $ config );
$ user = $ socialite -> create ( ' toutiao ' )-> userFromCode ( ' here is auth code ' );
$ user = $ socialite -> create ( ' toutiao ' )-> withOpenId ( ' openId ' )-> userFromToken ( ' here is the access token ' );
Примечание. Если при использовании службы
西瓜
вы хотите напрямую использовать access_token для получения информации о пользователе, сначала установите openid. Сначала вызовитеwithOpenId()
, а затемuserFromToken()
$ config = [
' xigua ' => [
' client_id ' => ' your app id ' ,
' client_secret ' => ' your app secret ' ,
' redirect ' => ' redirect URL '
]
];
$ socialite = new SocialiteManager ( $ config );
$ user = $ socialite -> create ( ' xigua ' )-> userFromCode ( ' here is auth code ' );
$ user = $ socialite -> create ( ' xigua ' )-> withOpenId ( ' openId ' )-> userFromToken ( ' here is the access token ' );
В других конфигурациях разницы нет. С точки зрения использования вы можете легко выбрать режим перенаправления страницы входа через withDisplay()
$ authUrl = $ socialite -> create ( ' baidu ' )-> withDisplay ( ' mobile ' )-> redirect ();
popup
режим — это режим использования инструмента по умолчанию. basic
— это используемое значение области по умолчанию.
Вы можете использовать режим внутреннего приложения, настроив app_ticket несколькими простыми способами.
$ config = [
' feishu ' => [
// or 'app_id'
' client_id ' => ' your app id ' ,
// or 'app_secret'
' client_secret ' => ' your app secret ' ,
// or 'redirect_url'
' redirect ' => ' redirect URL ' ,
// 如果你想使用使用内部应用的方式获取 app_access_token
// 对这个键设置了 'internal' 值那么你已经开启了内部应用模式
' app_mode ' => ' internal '
]
];
$ socialite = new SocialiteManager ( $ config );
$ feishuDriver = $ socialite -> create ( ' feishu ' );
$ feishuDriver -> withInternalAppMode ()-> userFromCode ( ' here is code ' );
$ feishuDriver -> withDefaultMode ()-> withAppTicket ( ' app_ticket ' )-> userFromCode ( ' here is code ' );
Вы можете использовать режим внутреннего приложения, настроив app_ticket несколькими простыми способами.
$ config = [
' lark ' => [
// or 'app_id'
' client_id ' => ' your app id ' ,
// or 'app_secret'
' client_secret ' => ' your app secret ' ,
// or 'redirect_url'
' redirect ' => ' redirect URL ' ,
// 如果你想使用使用内部应用的方式获取 app_access_token
// 对这个键设置了 'internal' 值那么你已经开启了内部应用模式
' app_mode ' => ' internal '
]
];
$ socialite = new SocialiteManager ( $ config );
$ larkDriver = $ socialite -> create ( ' lark ' );
$ larkDriver -> withInternalAppMode ()-> userFromCode ( ' here is code ' );
$ larkDriver -> withDefaultMode ()-> withAppTicket ( ' app_ticket ' )-> userFromCode ( ' here is code ' );
Другие конфигурации такие же, как и на других платформах. Вы можете выбрать тип страницы перенаправления, которую хотите отображать, с помощью withView()
$ authUrl = $ socialite -> create ( ' taobao ' )-> withView ( ' wap ' )-> redirect ();
web
-режим — это режим отображения по умолчанию, используемый инструментом, user_info
— значение области по умолчанию.
Мы поддерживаем открытые платформы для авторизации веб-страниц сторонних платформ от имени общедоступных учетных записей.
Вам просто нужно ввести свою конфигурацию, как показано ниже. Официальные аккаунты не требуют авторизации.
. . .
[
' wechat ' =>
[
' client_id ' => ' client_id ' ,
' client_secret ' => ' client_secret ' ,
' redirect ' => ' redirect-url ' ,
// 开放平台 - 第三方平台所需
' component ' => [
// or 'app_id', 'component_app_id' as key
' id ' => ' component-app-id ' ,
// or 'app_token', 'access_token', 'component_access_token' as key
' token ' => ' component-access-token ' ,
]
]
],
...
Вам необходимо дополнительно настроить team_url
в качестве доменного имени вашей команды, например:
$ config = [
' coding ' => [
' team_url ' => ' https://{your-team}.coding.net ' ,
' client_id ' => ' your app id ' ,
' client_secret ' => ' your app secret ' ,
' redirect ' => ' redirect URL ' ,
]
];
Возможно, вам потребуется установить тип ответа. Для его установки можно использовать функцию withResponseType
. По умолчанию используется code
, а также его можно установить на id_token
или code
& id_token
https://developer.paypal.com/docs/log-in-with-paypal/integrate/generate-button/
$ config = [
' paypal ' => [
' client_id ' => ' AT****************** ' ,
' client_secret ' => ' EK************** ' ,
' sandbox ' => false ,
' redirect_url ' => " nativexo://paypalpay " ,
],
];
Вы также можете использовать scopes()
, чтобы установить «области» запроса перед перенаправлением пользователя. Этот метод перезапишет все существующие области:
$ response = $ socialite -> create ( ' github ' )
-> scopes ([ ' scope1 ' , ' scope2 ' ])-> redirect ();
Вы также можете установить redirect_uri динамически. Для изменения URL-адреса redirect_uri
можно использовать следующий метод:
$ url = ' your callback url. ' ;
$ socialite -> redirect ( $ url );
// or
$ socialite -> withRedirectUrl ( $ url )-> redirect ();
Ваше приложение может предотвратить атаки подделки межсайтовых запросов (CSFR), используя параметр состояния, чтобы гарантировать, что ответ принадлежит тому же пользователю, который инициировал запрос. Атаки CSFR происходят, когда злоумышленник обманом заставляет пользователя выполнить нежелательные действия, на выполнение которых имеет право только пользователь, в доверенном веб-приложении, и все это без участия или предупреждения пользователя.
Вот минималистичный пример того, как предоставление состояния может сделать ваше приложение более безопасным. В этом примере мы используем идентификатор сеанса в качестве параметра состояния, но вы можете использовать любую логику, чтобы создать значение для состояния.
state
<?php
session_start ();
$ config = [
//...
];
// Assign to state the hashing of the session ID
$ state = hash ( ' sha256 ' , session_id ());
$ socialite = new SocialiteManager ( $ config );
$ url = $ socialite -> create ( ' github ' )-> withState ( $ state )-> redirect ();
return redirect ( $ url );
state
обратного вызоваКак только пользователь авторизует ваше приложение, он будет перенаправлен обратно на redirect_uri вашего приложения. Сервер OAuth возвращает параметры статуса без изменений. Убедитесь, что статус, указанный в redirect_uri, соответствует статусу, сгенерированному приложением:
<?php
session_start ();
$ state = request ()-> query ( ' state ' );
$ code = request ()-> query ( ' code ' );
// Check the state received with current session id
if ( $ state != hash ( ' sha256 ' , session_id ())) {
exit ( ' State does not match! ' );
}
$ user = $ socialite -> create ( ' github ' )-> userFromCode ( $ code );
// authorized
Посмотреть дополнительную документацию по параметрам state
Чтобы включить в запрос любые необязательные параметры, вызовите метод with()
передав ассоциативный массив значений, которые вы хотите установить:
$ response = $ socialite -> create ( ' google ' )
-> with ([ ' hd ' => ' example.com ' ])-> redirect ();
$ user = $ socialite -> create ( ' github ' )-> userFromCode ( $ code );
{
"id" : 1472352 ,
"nickname" : " overtrue " ,
"name" : "安正超" ,
"email" : " [email protected] " ,
"avatar" : " https://avatars.githubusercontent.com/u/1472352?v=3 " ,
"raw" : {
"login" : " overtrue " ,
"id" : 1472352 ,
"avatar_url" : " https://avatars.githubusercontent.com/u/1472352?v=3 " ,
"gravatar_id" : " " ,
"url" : " https://api.github.com/users/overtrue " ,
"html_url" : " https://github.com/overtrue " ,
...
},
"token_response" : {
"access_token" : " 5b1dc56d64fffbd052359f032716cc4e0a1cb9a0 " ,
"token_type" : " bearer " ,
"scope" : " user:email "
}
}
Вы можете получить атрибут пользователя как ключ массива следующим образом:
$ user [ ' id ' ]; // 1472352
$ user [ ' nickname ' ]; // "overtrue"
$ user [ ' name ' ]; // "安正超"
$ user [ ' email ' ]; // "[email protected]"
. . .
Или используйте метод объекта User
:
mixed $ user -> getId ();
?string $ user -> getNickname ();
?string $ user -> getName ();
?string $ user -> getEmail ();
?string $ user -> getAvatar ();
?string $ user -> getRaw ();
?string $ user -> getAccessToken ();
?string $ user -> getRefreshToken ();
?int $ user -> getExpiresIn ();
?array $ user -> getTokenResponse ();
Метод $user->getRaw()
возвращает массив .
Метод $user->getTokenResponse()
вернет массив , содержащий ответ, полученный от API при получении токена.
Примечание. Этот метод возвращает действительный массив только тогда, когда вы используете
userFromCode()
, в противном случае он вернет значение null , посколькуuserFromToken()
не имеет HTTP-ответа токена.
$ accessToken = ' xxxxxxxxxxx ' ;
$ user = $ socialite -> userFromToken ( $ accessToken );
Хотите знать, как создать пакет расширений PHP с нуля?
Пожалуйста, обратите внимание на мой практический курс, где я поделюсь опытом разработки расширений - "Практическое руководство PHP Extension Pack - From Getting Started to Release"
Массачусетский технологический институт