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, Gitee, การเขียนโค้ด.
หากคุณชอบโครงการของฉันและต้องการสนับสนุนฉัน คลิกที่นี่ ❤️
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 ' ,
]
];
คุณอาจต้องตั้งค่า 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 ();
คุณยังสามารถตั้งค่า ' เปลี่ยนเส้นทาง_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
การโทรกลับเมื่อผู้ใช้ให้สิทธิ์แอปของคุณแล้ว ผู้ใช้จะถูกเปลี่ยนเส้นทางกลับไปที่ เปลี่ยนเส้นทาง_uri ของแอปของคุณ เซิร์ฟเวอร์ OAuth ส่งคืนพารามิเตอร์สถานะไม่เปลี่ยนแปลง ตรวจสอบว่าสถานะที่ระบุใน เปลี่ยนเส้นทาง_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 - ตั้งแต่เริ่มต้นจนถึงเผยแพร่"
เอ็มไอที