• 集成Line、Facebook、Twitter、Google、微信、QQ、微博、支付宝的三方登录sdk


    下载地址:

    https://github.com/anerg2046/sns_auth

    安装方式建议使用composer进行安装

    如果linux执行composer不方便的话,可以在本地新建个文件夹,然后执行上面的composer命令,把代码sdk和composer文件一起上传到项目适当位置即可。

    示例代码:

    1. //以thinkCMF框架为例
    2. namespace app\home\controller;
    3. use cmf\controller\HomeBaseController;
    4. use think\facade\Db;
    5. use anerg\OAuth2\OAuth;
    6. class UserController extends HomebaseController{
    7. private function getThirdConfig($name){
    8. $site='http://xxxx.com'; //更改为自己站点域名
    9. //下面的参数需要根据自己的实际需求替换
    10. $line_config=[
    11. 'app_id'=>'login_line_appid',
    12. 'app_secret'=>'login_line_secret',
    13. 'scope'=>'profile'
    14. ];
    15. $facebook_config=[
    16. 'app_id'=>'login_facebook_appid',
    17. 'app_secret'=>'login_facebook_secret',
    18. 'scope'=>'public_profile'
    19. ];
    20. $google_config=[
    21. 'app_id'=>'login_google_appid'.'.apps.googleusercontent.com',
    22. 'app_secret'=>'login_google_secret',
    23. 'scope'=>'https://www.googleapis.com/auth/userinfo.profile'
    24. ];
    25. $twitter_config=[
    26. 'app_id'=>'login_twitter_appid',
    27. 'app_secret'=>'login_twitter_secret'
    28. ];
    29. $config=[];
    30. switch ($name) {
    31. case 'line':
    32. $config=$line_config;
    33. break;
    34. case 'facebook':
    35. $config=$facebook_config;
    36. break;
    37. case 'google':
    38. $config=$google_config;
    39. break;
    40. case 'twitter':
    41. $config=$twitter_config;
    42. break;
    43. }
    44. $config['callback']=$site.'/home/user/'.$name.'_callback';
    45. return $config;
    46. }
    47. /**
    48. * Line登录
    49. */
    50. public function line(){
    51. require_once '/sns_auth/vendor/autoload.php';
    52. $name='line';
    53. $config=$this->getThirdConfig($name);
    54. return redirect(OAuth::$name($config)->getRedirectUrl());
    55. }
    56. /**
    57. Line登陆回调
    58. **/
    59. public function line_callback(){
    60. $code= $_GET['code'] ?? '';
    61. if($code!=""){
    62. $this->third_callback('line');
    63. }else{
    64. $this->error('三方回调信息获取失败');
    65. }
    66. }
    67. /**
    68. * facebook登录
    69. */
    70. public function facebook(){
    71. require_once '/sns_auth/vendor/autoload.php';
    72. $name='facebook';
    73. $config=$this->getThirdConfig($name);
    74. return redirect(OAuth::$name($config)->getRedirectUrl());
    75. }
    76. /**
    77. * Facebook登陆回调
    78. */
    79. public function facebook_callback(){
    80. $code= $_GET['code'] ?? '';
    81. if($code!=""){
    82. $this->third_callback('facebook');
    83. }else{
    84. $this->error('三方回调信息获取失败');
    85. }
    86. }
    87. /**
    88. * Google登录
    89. */
    90. public function google(){
    91. require_once '/sns_auth/vendor/autoload.php';
    92. $name='google';
    93. $config=$this->getThirdConfig($name);
    94. return redirect(OAuth::$name($config)->getRedirectUrl());
    95. }
    96. /**
    97. * Google登陆回调
    98. */
    99. public function google_callback(){
    100. $code= $_GET['code'] ?? '';
    101. if($code!=""){
    102. $this->third_callback('google');
    103. }else{
    104. $this->error('三方回调信息获取失败');
    105. }
    106. }
    107. /**
    108. * twitter登录
    109. */
    110. public function twitter(){
    111. require_once '/sns_auth/vendor/autoload.php';
    112. $name='twitter';
    113. $config=$this->getThirdConfig($name);
    114. return redirect(OAuth::$name($config)->getRedirectUrl());
    115. }
    116. /**
    117. * twitter登陆回调
    118. */
    119. public function twitter_callback(){
    120. $code= $_GET['code'] ?? '';
    121. if($code!=""){
    122. $this->third_callback('twitter');
    123. }else{
    124. $this->error('三方回调信息获取失败');
    125. }
    126. }
    127. protected function third_callback($name){
    128. require_once '/sns_auth/vendor/autoload.php';
    129. $config=$this->getThirdConfig($name);
    130. $openinfo = OAuth::$name($config)->userinfo();
    131. if(!$openinfo){
    132. $this->error('三方信息验证失败');
    133. return;
    134. }
    135. /*$openinfo=[
    136. 'openid'=>'唯一标识',
    137. 'channel'=>'line',
    138. 'nick'=>'line昵称',
    139. 'gender'=>'性别',
    140. 'avatar'=>'line头像'
    141. ];*/
    142. $openid=$openinfo['openid'];
    143. $channel=$openinfo['channel'];
    144. $nickname=$openinfo['nick'];
    145. $avatar=$openinfo['avatar'];
    146. $userinfo=$this->loginByThird($channel,$openid,$nickname,$avatar);
    147. if($userinfo==1001){
    148. $this->assign("jumpUrl",'/');
    149. $this->error('该账号已被禁用');
    150. return;
    151. }
    152. if($userinfo==1002){
    153. $this->assign("jumpUrl",'/');
    154. $this->error('该账号已被注销');
    155. return;
    156. }
    157. if($userinfo==1003){
    158. $this->assign("jumpUrl",'/');
    159. $this->error('该账号已被禁用');
    160. return;
    161. }
    162. $configpub=getConfigPub();
    163. session('uid',$userinfo['id']);
    164. session('token',$userinfo['token']);
    165. session('user',$userinfo);
    166. $href='http://xxxx.com'; //替换为自己站点的域名
    167. echo "";
    168. }
    169. protected function loginByThird($type,$openid,$nickname,$avatar){
    170. //实际业务代码,根据自己项目做修改
    171. $info=DB::name('user')
    172. ->where("openid='{$openid}' and login_type='{$type}' and user_type=2")
    173. ->find();
    174. if(!$info){
    175. /* 注册 */
    176. $user_pass='abcdefg123456';
    177. $user_pass=cmf_password($user_pass); //密码加密,方法请自己实现
    178. $user_login=$type.'_'.time().rand(100,999);
    179. if(!$nickname){
    180. $nickname=$type.'用户-'.substr($openid,-4);
    181. }else{
    182. $nickname=urldecode($nickname);
    183. }
    184. if(!$avatar){
    185. $avatar='/default.jpg';
    186. $avatar_thumb='/default_thumb.jpg';
    187. }else{
    188. $avatar=urldecode($avatar);
    189. $avatar_thumb=$avatar;
    190. }
    191. $data=array(
    192. 'user_login' => $user_login,
    193. 'user_nickname' =>$nickname,
    194. 'user_pass' =>$user_pass,
    195. 'signature' =>'这家伙很懒,什么都没留下',
    196. 'avatar' =>$avatar,
    197. 'avatar_thumb' =>$avatar_thumb,
    198. 'last_login_ip' =>get_client_ip(0,true),
    199. 'create_time' => time(),
    200. 'user_status' => 1,
    201. 'openid' => $openid,
    202. 'login_type' => $type,
    203. "user_type" =>2,//会员
    204. "source" =>'pc'
    205. );
    206. $uid=DB::name('user')->insertGetId($data);
    207. $info['id']=$uid;
    208. $info['user_nickname']=$data['user_nickname'];
    209. $info['avatar']=$data['avatar'];
    210. $info['avatar_thumb']=$data['avatar_thumb'];
    211. $info['sex']='2';
    212. $info['signature']=$data['signature'];
    213. $info['coin']='0';
    214. $info['login_type']=$data['login_type'];
    215. $info['province']='';
    216. $info['city']='';
    217. $info['birthday']='';
    218. $info['consumption']='0';
    219. $info['votestotal']='0';
    220. $info['user_status']=1;
    221. $info['last_login_time']='';
    222. $info['end_bantime']='0';
    223. }else{
    224. if(!$avatar){
    225. $avatar='/default.jpg';
    226. $avatar_thumb='/default_thumb.jpg';
    227. }else{
    228. $avatar=urldecode($avatar);
    229. $avatar_thumb=$avatar;
    230. }
    231. $info['avatar']=$avatar;
    232. $info['avatar_thumb']=$avatar_thumb;
    233. $data=array(
    234. 'avatar' =>$avatar,
    235. 'avatar_thumb' =>$avatar_thumb,
    236. );
    237. }
    238. if($info['user_status']=='0'){
    239. return 1001;
    240. }
    241. if($info['user_status']=='3'){
    242. return 1002;
    243. }
    244. if($info['user_status']=='1'&& $info['end_bantime']>time()){
    245. return 1003;
    246. }
    247. $info['isreg']='0';
    248. $info['isagent']='0';
    249. if($info['last_login_time']=='' ){
    250. $info['isreg']='1';
    251. $info['isagent']='1';
    252. }
    253. $info['avatar']=get_upload_path($info['avatar']);
    254. $info['avatar_thumb']=get_upload_path($info['avatar_thumb']);
    255. return $info;
    256. }
    257. }

    代码中各个配置参数如何获取:

    facebook:

    ​​​​​​​

    Line:

    Google:

  • 相关阅读:
    嵌入式学习笔记(40)看门狗定时器
    09_CSS3多媒体查询
    Java面试丨Redis从基础到源码面试题(参考答案)
    高维多元时序数据之间的相似性度量
    React-Hook 轮子公开课(从零开始)用最基础的方式写出一个简单的组件库——第二课【Button】组件
    heic批量转jpg文件
    tomcat使用不同jdk的解决方法
    系统和系统实例-软件方法(下)第9章分析类图案例篇Part07
    安防监控视频云存储平台EasyCVR页面播放卡顿的优化方法
    【CentOS7+ Ambari 2.7.4 + HDP 3.1.4】搭建数据仓库
  • 原文地址:https://blog.csdn.net/salestina/article/details/134379340