Socialite ist ein OAuth2-Authentifizierungstool. Es ist von Laravel/Socialite inspiriert und kann problemlos in jedem PHP-Projekt verwendet werden. Englisches Dokument
Das Tool unterstützt jetzt die folgenden Plattformen: Facebook, Github, Google, Linkedin, Outlook, QQ, TAPD, Alipay, Taobao, Baidu, DingTalk, Weibo, WeChat, Douyin, Feishu, Lark, Douban, Enterprise WeChat, Tencent Cloud, Line, Gitee, Codierung.
Wenn Dir meine Projekte gefallen und Du mich unterstützen möchtest, klicke hier ❤️
PHP >= 8.0.2
composer require " overtrue/socialite " -vvv
Benutzer müssen lediglich entsprechende Konfigurationsvariablen erstellen, dann Tools verwenden, um Authentifizierungsanwendungen für jede Plattform zu erstellen und problemlos das access_token und benutzerbezogene Informationen der Plattform abzurufen. Einzelheiten zur Tool-Implementierungslogik finden Sie in den OAuth2-Dokumenten der einzelnen Hauptplattformen.
Die Nutzung des Tools gliedert sich grob in die folgenden Schritte:
Ein praktischeres Integrationspaket für Laravel-Benutzer: overtrue/laravel-socialite
authorize.php
: Lassen Sie den Benutzer zur Plattformauthentifizierung springen
<?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]"
. . .
Es funktioniert sofort, indem für jede Plattform die gleichen Schlüssel-Wert-Paare festgelegt werden: client_id
, client_secret
, redirect
.
Beispiel:
$ 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 ' ,
],
];
Sie können jede Plattform mit einem beliebigen Namen benennen, z. B. foo
. Nach Verwendung der Alias-Methode müssen Sie in der Konfiguration einen zusätzlichen provider
festlegen, um dem Toolkit mitzuteilen, wie das gewünschte Programm korrekt gefunden werden soll:
$ 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 ' );
Sie können ganz einfach Anwendungen von benutzerdefinierten Dienstanbietern erstellen, indem Sie diese beiden Punkte befolgen:
Benutzerdefinierten Ersteller verwenden
Wie im folgenden Code gezeigt, ist der Name des Dienstanbieters für die Foo-Anwendung definiert, das Tool selbst unterstützt ihn jedoch noch nicht. Daher wird der Ersteller extend()
verwendet, um eine Instanz des Dienstanbieters in Form eines Abschlusses zu erstellen Funktion.
$ 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 ' );
Wichtig
? Ihre benutzerdefinierte Dienstanbieterklasse muss die Schnittstelle OvertrueSocialiteContractsProviderInterface
implementieren
class MyCustomProvider implements Overtrue Socialite Contracts ProviderInterface
{
//...
}
Legen Sie als Nächstes den Klassennamen für provider
fest, damit Tools die Klasse finden und instanziieren können:
$ 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 ' );
Verschiedene Plattformen verfügen über unterschiedliche Konfigurationsmethoden. Um den normalen Betrieb des Tools sicherzustellen, stellen Sie bitte sicher, dass die Konfiguration der von Ihnen verwendeten Plattform wie erwartet eingestellt ist.
Bitte konfigurieren Sie wie folgt
$ 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 (); // "安正超"
. . .
Dieses Tool unterstützt derzeit nur die Authentifizierungsmethode RSA2 mit persönlichem privaten Schlüssel.
Wie die Dokumentation zeigt
Hinweis: Dieses Tool unterstützt nur QR-Code zum Herstellen einer Verbindung zu Websites Dritter, um Benutzerinformationen (Opeid, Unionid und Spitzname) zu erhalten.
$ 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 (); // "安正超"
. . .
Hinweis: Wenn Sie den Douyin-Dienst verwenden und access_token direkt zum Abrufen von Benutzerinformationen verwenden möchten, legen Sie bitte zuerst openid fest. Rufen Sie zuerst
withOpenId()
und dannuserFromToken()
auf
$ 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 ' );
Hinweis: Wenn Sie den
头条
-Dienst verwenden und access_token direkt zum Abrufen von Benutzerinformationen verwenden möchten, legen Sie bitte zuerst openid fest. Rufen Sie zuerstwithOpenId()
und dannuserFromToken()
auf
$ 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 ' );
Hinweis: Wenn Sie bei Verwendung des
西瓜
Dienstes access_token direkt zum Abrufen von Benutzerinformationen verwenden möchten, legen Sie bitte zuerst openid fest. Rufen Sie zuerstwithOpenId()
und dannuserFromToken()
auf
$ 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 ' );
Es gibt keinen Unterschied zu anderen Konfigurationen. In Bezug auf die Verwendung können Sie den Modus zum Umleiten der Anmeldeseite einfach über withDisplay()
auswählen.
$ authUrl = $ socialite -> create ( ' baidu ' )-> withDisplay ( ' mobile ' )-> redirect ();
popup
-Modus ist der Standardnutzungsmodus innerhalb des Tools. basic
ist der standardmäßig verwendete Bereichswert.
Sie können den internen Anwendungsmodus verwenden, indem Sie app_ticket auf einfache Weise konfigurieren
$ 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 ' );
Sie können den internen Anwendungsmodus verwenden, indem Sie app_ticket auf einfache Weise konfigurieren
$ 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 ' );
Andere Konfigurationen sind die gleichen wie auf anderen Plattformen. Sie können den Typ der Weiterleitungsseite auswählen, die Sie anzeigen möchten, indem Sie withView()
verwenden.
$ authUrl = $ socialite -> create ( ' taobao ' )-> withView ( ' wap ' )-> redirect ();
Der web
ist der vom Tool verwendete Standardanzeigemodus user_info
ist der Standardbereichswert.
Wir unterstützen offene Plattformen, um Webseiten Dritter im Namen öffentlicher Konten zu autorisieren.
Sie müssen lediglich Ihre Konfiguration wie unten beschrieben eingeben. Für offizielle Konten ist keine Autorisierung erforderlich.
. . .
[
' 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 ' ,
]
]
],
...
Sie müssen zusätzlich team_url
als Ihren Team-Domänennamen konfigurieren, zum Beispiel:
$ config = [
' coding ' => [
' team_url ' => ' https://{your-team}.coding.net ' ,
' client_id ' => ' your app id ' ,
' client_secret ' => ' your app secret ' ,
' redirect ' => ' redirect URL ' ,
]
];
Möglicherweise müssen Sie den Antworttyp festlegen. Sie können ihn mit der Funktion „ withResponseType
festlegen. Der Standardwert ist code
und kann auch auf id_token
oder 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 " ,
],
];
Sie können auch scopes()
verwenden, um „Bereiche“ für die Anfrage festzulegen, bevor Sie den Benutzer umleiten. Diese Methode überschreibt alle vorhandenen Bereiche:
$ response = $ socialite -> create ( ' github ' )
-> scopes ([ ' scope1 ' , ' scope2 ' ])-> redirect ();
Sie können „redirect_uri“ auch dynamisch festlegen. Sie können die folgende Methode verwenden, um die URL redirect_uri
zu ändern:
$ url = ' your callback url. ' ;
$ socialite -> redirect ( $ url );
// or
$ socialite -> withRedirectUrl ( $ url )-> redirect ();
Ihre Anwendung kann CSFR-Angriffe (Cross-Site Request Forgery) verhindern, indem sie einen Statusparameter verwendet, um sicherzustellen, dass die Antwort demselben Benutzer gehört, der die Anfrage initiiert hat. CSFR-Angriffe treten auf, wenn ein böswilliger Angreifer einen Benutzer dazu verleitet, unerwünschte Aktionen auszuführen, zu deren Ausführung nur der Benutzer in einer vertrauenswürdigen Webanwendung berechtigt ist, ohne den Benutzer einzubeziehen oder zu warnen.
Hier ist ein minimalistisches Beispiel dafür, wie die Bereitstellung des Status Ihre Anwendung sicherer machen kann. In diesem Beispiel verwenden wir die Sitzungs-ID als Statusparameter, Sie können jedoch jede beliebige Logik verwenden, um einen Wert für den Status zu erstellen.
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
Sobald der Benutzer Ihre App autorisiert, wird er zurück zum Redirect_uri Ihrer App weitergeleitet. Der OAuth-Server gibt die Statusparameter unverändert zurück. Überprüfen Sie, ob der in der Redirect_uri angegebene Status mit dem von der Anwendung generierten Status übereinstimmt:
<?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
Weitere Dokumentation zu state
anzeigen
Um optionale Parameter in die Anfrage aufzunehmen, rufen Sie die Methode with()
auf und übergeben Sie ein assoziatives Array der Werte, die Sie festlegen möchten:
$ 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 "
}
}
Sie können das Benutzerattribut wie folgt als Array-Schlüssel erhalten:
$ user [ ' id ' ]; // 1472352
$ user [ ' nickname ' ]; // "overtrue"
$ user [ ' name ' ]; // "安正超"
$ user [ ' email ' ]; // "[email protected]"
. . .
Oder verwenden Sie die Methode des User
-Objekts:
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()
gibt ein Array zurück.
Die Methode $user->getTokenResponse()
gibt ein Array zurück, das die von der API beim Abrufen des Tokens zurückgegebene Antwort enthält.
Hinweis: Diese Methode gibt nur dann ein gültiges Array zurück, wenn Sie
userFromCode()
verwenden. Andernfalls wird null zurückgegeben, dauserFromToken()
keine HTTP-Antwort des Tokens hat.
$ accessToken = ' xxxxxxxxxxx ' ;
$ user = $ socialite -> userFromToken ( $ accessToken );
Sie fragen sich, wie Sie ein PHP-Erweiterungspaket von Grund auf erstellen können?
Bitte achten Sie auf meinen praktischen Kurs, in dem ich einige Erfahrungen in der Erweiterungsentwicklung weitergeben werde – „Praktisches Tutorial zum PHP Extension Pack – Von den ersten Schritten bis zur Veröffentlichung“.
MIT