Socialite es una herramienta de autenticación OAuth2. Está inspirado en laravel/socialite y puedes usarlo fácilmente en cualquier proyecto PHP. documento en ingles
La herramienta ahora es compatible con las siguientes plataformas: Facebook, Github, Google, Linkedin, Outlook, QQ, TAPD, Alipay, Taobao, Baidu, DingTalk, Weibo, WeChat, Douyin, Feishu, Lark, Douban, Enterprise WeChat, Tencent Cloud, Line, Casa rural, codificación.
Si te gustan mis proyectos y quieres apoyarme, haz clic aquí ❤️
PHP >= 8.0.2
composer require " overtrue/socialite " -vvv
Los usuarios solo necesitan crear las variables de configuración correspondientes, luego usar herramientas para crear aplicaciones de autenticación para cada plataforma y obtener fácilmente el token de acceso de la plataforma y la información relacionada con el usuario. Para obtener detalles sobre la lógica de implementación de la herramienta, consulte los documentos OAuth2 de cada plataforma principal.
El uso de la herramienta se divide aproximadamente en los siguientes pasos:
Un paquete de integración más conveniente creado para usuarios de Laravel: overtrue/laravel-socialite
authorize.php
: permite que el usuario salte a la autenticación de la plataforma.
<?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]"
. . .
Funciona de inmediato configurando los mismos pares clave-valor para cada plataforma: client_id
, client_secret
, redirect
.
Ejemplo:
$ 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 ' ,
],
];
Puede nombrar cada plataforma con el nombre que desee, como foo
. Después de usar el método de alias, debe establecer una clave provider
adicional en la configuración para indicarle al kit de herramientas cómo encontrar correctamente el programa que desea:
$ 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 ' );
Puede crear fácilmente aplicaciones desde proveedores de servicios personalizados siguiendo estos dos puntos:
Usar creador personalizado
Como se muestra en el siguiente código, el nombre del proveedor de servicios está definido para la aplicación foo, pero la herramienta en sí aún no lo admite, por lo que el creador extend()
se usa para crear una instancia del proveedor de servicios en forma de cierre. función.
$ 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 ' );
Importante
¿Su clase de proveedor de servicios personalizado debe implementar la interfaz OvertrueSocialiteContractsProviderInterface
?
class MyCustomProvider implements Overtrue Socialite Contracts ProviderInterface
{
//...
}
A continuación, establezca el nombre de la clase para provider
para que las herramientas puedan encontrar la clase y crear una instancia de ella:
$ 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 ' );
Diferentes plataformas tienen diferentes métodos de configuración Para garantizar el funcionamiento normal de la herramienta, asegúrese de que la configuración de la plataforma que está utilizando sea la esperada.
Por favor configure de la siguiente manera
$ 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 (); // "安正超"
. . .
Actualmente, esta herramienta solo admite el método de autenticación de clave privada personal RSA2.
Como muestra la documentación
Nota: Esta herramienta solo admite códigos QR para conectarse a sitios web de terceros para obtener información del usuario (opeid, unionid y apodo).
$ 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 (); // "安正超"
. . .
Nota: Cuando utilice el servicio Douyin, si desea utilizar access_token directamente para obtener información del usuario, primero configure openid. Llame
withOpenId()
primero y luegouserFromToken()
$ 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 ' );
Nota: Cuando utilice el servicio
头条
, si desea utilizar access_token directamente para obtener información del usuario, primero configure openid. LlamewithOpenId()
primero y luegouserFromToken()
$ 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 ' );
Nota: Cuando utilice el servicio
西瓜
, si desea utilizar access_token directamente para obtener información del usuario, primero configure openid. LlamewithOpenId()
primero y luegouserFromToken()
$ 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 ' );
No hay diferencia en otras configuraciones en términos de uso, puede elegir fácilmente el modo de redirigir la página de inicio de sesión a través de withDisplay()
$ authUrl = $ socialite -> create ( ' baidu ' )-> withDisplay ( ' mobile ' )-> redirect ();
El modo popup
es el modo de uso predeterminado dentro de la herramienta. basic
es el valor de alcance predeterminado utilizado.
Puede utilizar el modo de aplicación interna configurando app_ticket de algunas formas sencillas
$ 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 ' );
Puede utilizar el modo de aplicación interna configurando app_ticket de algunas formas sencillas
$ 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 ' );
Otras configuraciones son las mismas que en otras plataformas, puede seleccionar el tipo de página de redireccionamiento que desea mostrar usando withView()
$ authUrl = $ socialite -> create ( ' taobao ' )-> withView ( ' wap ' )-> redirect ();
El modo web
es el modo de visualización predeterminado utilizado por la herramienta user_info
es el valor de alcance predeterminado.
Admitimos plataformas abiertas para autorizar páginas web de plataformas de terceros en nombre de cuentas públicas.
Sólo necesita ingresar su configuración como se muestra a continuación. Las cuentas oficiales no requieren autorización.
. . .
[
' 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 ' ,
]
]
],
...
Además, debe configurar team_url
como el nombre de dominio de su equipo, por ejemplo:
$ config = [
' coding ' => [
' team_url ' => ' https://{your-team}.coding.net ' ,
' client_id ' => ' your app id ' ,
' client_secret ' => ' your app secret ' ,
' redirect ' => ' redirect URL ' ,
]
];
Es posible que necesite configurar el tipo de respuesta. Puede usar la función withResponseType
para configurarlo. El valor predeterminado es code
y también se puede configurar en id_token
o 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 " ,
],
];
También puede utilizar scopes()
para establecer "ámbitos" en la solicitud antes de redirigir al usuario. Este método sobrescribirá todos los ámbitos existentes:
$ response = $ socialite -> create ( ' github ' )
-> scopes ([ ' scope1 ' , ' scope2 ' ])-> redirect ();
También puede configurar 'redirect_uri' dinámicamente; puede utilizar el siguiente método para cambiar la URL redirect_uri
:
$ url = ' your callback url. ' ;
$ socialite -> redirect ( $ url );
// or
$ socialite -> withRedirectUrl ( $ url )-> redirect ();
Su aplicación puede evitar ataques de falsificación de solicitudes entre sitios (CSFR) mediante el uso de un parámetro de estado para garantizar que la respuesta pertenezca al mismo usuario que inició la solicitud. Los ataques CSFR ocurren cuando un atacante malintencionado engaña a un usuario para que realice acciones no deseadas que solo el usuario tiene permiso para realizar en una aplicación web confiable, todo sin involucrar ni advertir al usuario.
A continuación se muestra un ejemplo minimalista de cómo proporcionar un estado puede hacer que su aplicación sea más segura. En este ejemplo, usamos el ID de sesión como parámetro de estado, pero puede usar cualquier lógica que desee para crear un valor para el estado.
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
de devolución de llamadaUna vez que el usuario autoriza su aplicación, será redirigido nuevamente al redirección_uri de su aplicación. El servidor OAuth devuelve los parámetros de estado sin cambios. Compruebe que el estado proporcionado en el redireccionamiento_uri coincida con el estado generado por la aplicación:
<?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
Ver más documentación sobre parámetros state
Para incluir parámetros opcionales en la solicitud, llame al método with()
pasando una matriz asociativa de los valores que desea establecer:
$ 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 "
}
}
Puede obtener el atributo de usuario como una clave de matriz como esta:
$ user [ ' id ' ]; // 1472352
$ user [ ' nickname ' ]; // "overtrue"
$ user [ ' name ' ]; // "安正超"
$ user [ ' email ' ]; // "[email protected]"
. . .
O utilice el método del objeto 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()
devuelve una matriz .
El método $user->getTokenResponse()
devolverá una matriz que contiene la respuesta devuelta por la API al adquirir el token.
Nota: Este método solo devuelve una matriz válida cuando usa
userFromCode()
; de lo contrario, devolverá un valor nulo porqueuserFromToken()
no tiene una respuesta HTTP de token.
$ accessToken = ' xxxxxxxxxxx ' ;
$ user = $ socialite -> userFromToken ( $ accessToken );
¿Se pregunta cómo crear un paquete de extensión PHP desde cero?
Preste atención a mi curso práctico, donde compartiré alguna experiencia en el desarrollo de extensiones: "Tutorial práctico del paquete de extensiones PHP: desde el inicio hasta el lanzamiento".
MIT