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، جيتي، الترميز.
إذا أعجبتك مشاريعي وتريد دعمي اضغط هنا ❤️
بي إتش بي >= 8.0.2
composer require " overtrue/socialite " -vvv
يحتاج المستخدمون فقط إلى إنشاء متغيرات التكوين المقابلة، ثم استخدام الأدوات لإنشاء تطبيقات مصادقة لكل نظام أساسي، والحصول بسهولة على رمز الوصول الخاص بالنظام الأساسي والمعلومات المتعلقة بالمستخدم. للحصول على تفاصيل حول منطق تنفيذ الأداة، يرجى الرجوع إلى وثائق 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
. بعد استخدام طريقة الاسم المستعار، تحتاج إلى تعيين مفتاح 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 فقط.
كما تظهر الوثائق
ملحوظة: هذه الأداة تدعم فقط رمز الاستجابة السريعة للاتصال بمواقع الطرف الثالث للحصول على معلومات المستخدم (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 ' ,
]
];
قد تحتاج إلى تعيين ResponseType. يمكنك استخدام وظيفة 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()
، وإلا فإنها سترجع قيمة فارغة لأنuserFromToken()
ليس لديه استجابة HTTP للرمز المميز.
$ accessToken = ' xxxxxxxxxxx ' ;
$ user = $ socialite -> userFromToken ( $ accessToken );
هل تتساءل عن كيفية إنشاء حزمة امتداد PHP من البداية؟
يرجى الانتباه إلى الدورة التدريبية العملية الخاصة بي، حيث سأشارك بعض خبرتي في تطوير الامتدادات - "البرنامج التعليمي العملي لحزمة PHP Extension Pack - من البداية إلى الإصدار"
معهد ماساتشوستس للتكنولوجيا