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

下载地址:

https://githubfast.com/anerg2046/sns_auth

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

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

示例代码:

<?php
    //以thinkCMF框架为例

    namespace app\home\controller;
    use cmf\controller\HomeBaseController;
    use think\facade\Db;
    use anerg\OAuth2\OAuth;

    class UserController extends HomebaseController{

        private function getThirdConfig($name){


            $site='http://xxxx.com'; //更改为自己站点域名
        
            //下面的参数需要根据自己的实际需求替换

            $line_config=[
                'app_id'=>'login_line_appid',
                'app_secret'=>'login_line_secret',
                'scope'=>'profile'
            ];


            $facebook_config=[
                'app_id'=>'login_facebook_appid',
                'app_secret'=>'login_facebook_secret',
                'scope'=>'public_profile'
            ];

            $google_config=[
                'app_id'=>'login_google_appid'.'.apps.googleusercontent.com',
                'app_secret'=>'login_google_secret',
                'scope'=>'https://www.googleapis.com/auth/userinfo.profile'
            ];

            $twitter_config=[
                'app_id'=>'login_twitter_appid',
                'app_secret'=>'login_twitter_secret'
            ];

            $config=[];

            switch ($name) {
                case 'line':
                    $config=$line_config;
                    break;
            
                case 'facebook':
                    $config=$facebook_config;
                    break;

                case 'google':
                    $config=$google_config;
                    break;

                case 'twitter':
                    $config=$twitter_config;
                    break;
            }

            $config['callback']=$site.'/home/user/'.$name.'_callback';

            return $config;

        }

        /**
         * Line登录
         */
        public function line(){
            require_once '/sns_auth/vendor/autoload.php';

            $name='line';
            $config=$this->getThirdConfig($name);
        
            return redirect(OAuth::$name($config)->getRedirectUrl());
        }
	
	    /**
	    Line登陆回调
	    **/
	    public function line_callback(){

            $code= $_GET['code'] ?? '';

		    if($code!=""){

                $this->third_callback('line');

		    }else{
                $this->error('三方回调信息获取失败');
            }

	    }

        /**
         * facebook登录
         */
        public function facebook(){
            require_once '/sns_auth/vendor/autoload.php';
            $name='facebook';
            $config=$this->getThirdConfig($name);
        
            return redirect(OAuth::$name($config)->getRedirectUrl());
        }

        /**
        * Facebook登陆回调
        */
        public function facebook_callback(){
            $code= $_GET['code'] ?? '';

            if($code!=""){

                $this->third_callback('facebook');

            }else{
                $this->error('三方回调信息获取失败');
            }
        }

        /**
         * Google登录
         */
        public function google(){
            require_once '/sns_auth/vendor/autoload.php';
            $name='google';
            $config=$this->getThirdConfig($name);
        
            return redirect(OAuth::$name($config)->getRedirectUrl());
        }

        /**
        * Google登陆回调
        */
        public function google_callback(){
            $code= $_GET['code'] ?? '';

            if($code!=""){

                $this->third_callback('google');

            }else{
                $this->error('三方回调信息获取失败');
            }
        }


        /**
         * twitter登录
         */
        public function twitter(){
            require_once '/sns_auth/vendor/autoload.php';
            $name='twitter';
            $config=$this->getThirdConfig($name);
        
            return redirect(OAuth::$name($config)->getRedirectUrl());
        }

        /**
        * twitter登陆回调
        */
        public function twitter_callback(){
            $code= $_GET['code'] ?? '';

            if($code!=""){

                $this->third_callback('twitter');

            }else{
                $this->error('三方回调信息获取失败');
            }
        }


        protected function third_callback($name){

            require_once '/sns_auth/vendor/autoload.php';

            $config=$this->getThirdConfig($name);
    
            $openinfo = OAuth::$name($config)->userinfo();

            if(!$openinfo){
                $this->error('三方信息验证失败');
                return;
            }

            /*$openinfo=[
                'openid'=>'唯一标识',
                'channel'=>'line',
                'nick'=>'line昵称',
                'gender'=>'性别',
                'avatar'=>'line头像'
            ];*/

            $openid=$openinfo['openid'];
            $channel=$openinfo['channel'];
        

            $nickname=$openinfo['nick'];
            $avatar=$openinfo['avatar'];
            $userinfo=$this->loginByThird($channel,$openid,$nickname,$avatar);
            if($userinfo==1001){
                $this->assign("jumpUrl",'/');
                $this->error('该账号已被禁用');
                return;
            }


            if($userinfo==1002){
                $this->assign("jumpUrl",'/');
                $this->error('该账号已被注销');
                return;
            }

            if($userinfo==1003){
                $this->assign("jumpUrl",'/');
                $this->error('该账号已被禁用');
                return;
            }

            $configpub=getConfigPub();
        
            session('uid',$userinfo['id']);
            session('token',$userinfo['token']);
            session('user',$userinfo);
            $href='http://xxxx.com'; //替换为自己站点的域名
            echo "<meta http-equiv=refresh content='0; url=$href'>";
        }

    
        protected function loginByThird($type,$openid,$nickname,$avatar){

            //实际业务代码,根据自己项目做修改

            $info=DB::name('user')
            ->where("openid='{$openid}' and login_type='{$type}' and user_type=2")
            ->find();
            
		    if(!$info){
			    /* 注册 */
			    $user_pass='abcdefg123456';
			    $user_pass=cmf_password($user_pass); //密码加密,方法请自己实现
			    $user_login=$type.'_'.time().rand(100,999);

			    if(!$nickname){
				    $nickname=$type.'用户-'.substr($openid,-4);
			    }else{
				    $nickname=urldecode($nickname);
			    }
			    if(!$avatar){
				    $avatar='/default.jpg';
				    $avatar_thumb='/default_thumb.jpg';
			    }else{
				    $avatar=urldecode($avatar);
                    $avatar_thumb=$avatar;
			    }
			
			    $data=array(
				    'user_login'    => $user_login,
				    'user_nickname' =>$nickname,
				    'user_pass'     =>$user_pass,
				    'signature'     =>'这家伙很懒,什么都没留下',
				    'avatar'        =>$avatar,
				    'avatar_thumb'  =>$avatar_thumb,
				    'last_login_ip' =>get_client_ip(0,true),
				    'create_time'   => time(),
				    'user_status'   => 1,
				    'openid'        => $openid,
				    'login_type'    => $type,
				    "user_type"     =>2,//会员
				    "source"        =>'pc'
			    );
            
			
                $uid=DB::name('user')->insertGetId($data);

            
			    $info['id']=$uid;
			    $info['user_nickname']=$data['user_nickname'];
			    $info['avatar']=$data['avatar'];
			    $info['avatar_thumb']=$data['avatar_thumb'];
			    $info['sex']='2';
			    $info['signature']=$data['signature'];
			    $info['coin']='0';
			    $info['login_type']=$data['login_type'];
			    $info['province']='';
			    $info['city']='';
			    $info['birthday']='';
			    $info['consumption']='0';
			    $info['votestotal']='0';
			    $info['user_status']=1;
			    $info['last_login_time']='';
                $info['end_bantime']='0';
		    }else{
			    if(!$avatar){
				    $avatar='/default.jpg';
				    $avatar_thumb='/default_thumb.jpg';
			    }else{
				    $avatar=urldecode($avatar);
                    $avatar_thumb=$avatar;
			    }
			
			    $info['avatar']=$avatar;
			    $info['avatar_thumb']=$avatar_thumb;
			
			    $data=array(
				    'avatar' =>$avatar,
				    'avatar_thumb' =>$avatar_thumb,
			    );
			
		    }
		
		    if($info['user_status']=='0'){
			    return 1001;					
		    }

		    if($info['user_status']=='3'){
			    return 1002;					
		    }

		    if($info['user_status']=='1'&& $info['end_bantime']>time()){
			    return 1003;					
		    }
		
		    $info['isreg']='0';
		    $info['isagent']='0';
		    if($info['last_login_time']=='' ){
			    $info['isreg']='1';
			    $info['isagent']='1';
		    }


		    $info['avatar']=get_upload_path($info['avatar']);
		    $info['avatar_thumb']=get_upload_path($info['avatar_thumb']);

            return $info;
        }
    }

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

facebook:

Line:

Google:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/139673.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】定时器+基本定时器

一、定时器的基本概述 1.软件定时器原理 原来我们使用51单片机的时候&#xff0c;是通过一个__nop()__来进行延时 我们通过软件的方式来进行延时功能是不准确的&#xff0c;受到很多不确定因素。 2.定时器原理&#xff1a;计数之间的比值 因为使用软件延时受到影响&#xff0c…

Scala---介绍及安装使用

一、Scala介绍 1. 为什么学习Scala语言 Scala是基于JVM的语言&#xff0c;与java语言类似&#xff0c;Java语言是基于JVM的面向对象的语言。Scala也是基于JVM&#xff0c;同时支持面向对象和面向函数的编程语言。这里学习Scala语言的原因是后期我们会学习一个优秀的计算框架S…

企业如何管理员工电脑和规范电脑的使用

企业如何管理员工电脑和规范电脑的使用 在现代信息时代&#xff0c;数据安全问题已经成为各个领域都面临的挑战。随着大数据的快速发展和互联网的普及&#xff0c;数据泄露的风险也逐渐增加。而作为企业或个人用户&#xff0c;如何保护自己的数据&#xff0c;避免泄露给不法分…

ios 对话框UIAlertController放 tableview

//强弱引用 #define kWeakSelf(type)__weak typeof(type)weak##type type; -(void) showUIAlertTable {kWeakSelf(self)UIAlertController *alert [UIAlertController alertControllerWithTitle:NSLocalizedString("select_stu", nil) message:nil prefer…

构建Docker基础镜像(ubuntu20.04+python3.9.10+pytorch-gpu-cuda11.8)

文章目录 一、前置条件1.创建 ubuntu 镜像源文件【sources.list】2.下载 python 安装包【Python-3.9.10.tgz】 二、构建方法1.构建目录2.创建DockerFile3.打包镜像 一、前置条件 配置一下 ubuntu 的镜像源下载 python 安装包 1.创建 ubuntu 镜像源文件【sources.list】 内容…

麒麟信安登录央视,深度展现为中国信息安全铸“魂”之路

麒麟信安登录央视&#xff0c;深度展现为中国信息安全铸“魂”之路 近日&#xff0c;麒麟信安登录央视频道&#xff0c;《麒麟信安——为中国信息安全铸“魂”》在CCTV-4中文国际频道、CCTV-7国防军事频道、CCTV-10 科教频道、CCTV-12社会与法频道、CCTV-17农业农村频道&#x…

动态调整学习率Lr

动态调整学习率Lr 0 引入1 代码例程1.1 工作方式解释 2 动态调整学习率的几种方法2.1 lr_scheduler.LambdaLR2.2 lr_scheduler.StepLR2.3 lr_scheduler.MultiStepLR2.4 lr_scheduler.ExponentialLR2.2.5 lr_scheduler.CosineAnnealingLR2.6 lr_scheduler.ReduceLROnPlateau2.7 …

后门程序2

System\CurrentControlSet\Services\Disk\Enum Windows 操作系统注册表中的一个路径。这个路径通常包含有关磁盘设备的信息。在这个特定的路径下&#xff0c;可能存储了有关磁盘枚举的配置和参数 Enum&#xff08;枚举&#xff09;子键通常包含了系统对磁盘的枚举信息&#xf…

网络安全/黑客技术(0基础入门到进阶提升)

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

高通SDX12:ASoC 音频框架浅析

一、简介 ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。 本文基于高通SDX12平台,对ASoC框架做一个分析。 二、整体框架 1. 硬件层面 嵌入式Linux设备的Audio subsystem可以划分为Machine(板…

关于企业海外Social平台营销布局,你需要了解这三件事

01 企业Social营销布局模式 Social营销走到现在&#xff0c;早已进入了标准配置期。任何企业和组织&#xff0c;进行营销宣传的时候都会在社媒社交平台上创建账号和运营。目前&#xff0c;海外Social平台营销模式基本分为四类&#xff1a; 官方社媒账号运营&#xff1a;以Hoot…

HTML5学习系列之主结构

HTML5学习系列之主结构 前言HTML5主结构定义页眉定义导航定义主要区域定义文章块定义区块定义附栏定义页脚 具体使用总结 前言 学习记录 HTML5主结构 定义页眉 head表示页眉&#xff0c;用来表示标题栏&#xff0c;引导和导航作用的结构元素。 <header role"banner…

使用Python和requests库的简单爬虫程序

这是一个使用Python和requests库的简单爬虫程序。我们将使用代理来爬取网页内容。以下是代码和解释&#xff1a; import requests from fake_useragent import UserAgent # 每行代理信息 proxy_host "jshk.com.cn" # 创建一个代理器 proxy {http: http:// proxy_…

SQLServer添加Oracle链接服务器

又一次在项目中用到了在SQLServer添加Oracle链接服务器&#xff0c;发现之前文章写的也不太好使&#xff0c;那就再总结一次吧。 1、安装OracleClient 安装64位&#xff0c;多数SQLServer是64位&#xff0c;所以OracleClient也安装64位的&#xff1b; 再一个一般安装的Oracl…

Python二级 每周练习题26

如果你感觉有收获&#xff0c;欢迎给我打赏 ———— 以激励我输出更多优质内容 练习一: 从键盘输入任意字符串&#xff0c;按照下面要求分离字符串中的字符&#xff1a; 1、分别取出该字符串的第偶数位的元素&#xff08;提醒注意&#xff1a;是按照从左往右数的 方式确定字…

新增配置字

新增的配置字 “使用的集成功放通道数量”&#xff0c;我的理解 channelnum 和 有没有AVAS有关&#xff0c;油车的话没有AVAS&#xff1b; a2b :有外置功放肯定有a2b; amp1:内置功放&#xff1b; amp2:Avas 用的内置功放&#xff1b;

如何防止听力下降?

听力受损是不可逆的&#xff0c;一旦听力下降了是无法恢复的&#xff0c;所以当我们出现听力障碍的时候&#xff0c;我们更应该注意我们的耳朵&#xff0c;想想如何能保护我们的残余听力&#xff01; 今天来告诉大家&#xff0c;哪些事是有易于听力的&#xff0c;一起来看看吧…

一款免费好用的制作电子杂志网站,发现新大陆~

你是不是也厌倦了传统纸质杂志的限制&#xff0c;想要尝试一种全新的阅读体验&#xff1f;那么&#xff0c;今天我要向你推荐的这款免费好用的制作电子杂志网站&#xff0c;绝对能让你眼前一亮&#xff01; 这款网站就是FLBOOK在线制作电子杂志平台&#xff0c;并且界面简洁、操…

Kubernetes介绍和环境部署

文章目录 Kubernetes一、Kubernetes介绍1.Kubernetes简介2.Kubernetes概念3.Kubernetes功能4.Kubernetes工作原理5.kubernetes组件6.Kubernetes优缺点 二、Kubernetes环境部署环境基本配置1.所有节点安装docker2.所有节点安装kubeadm、kubelet、kubectl添加yum源containerd配置…

【带头学C++】----- 五、字符串操作函数 ---- 5.1 字符串操作函数

5.1字符串操作函数(以str开头的字符串处理函数默认遇到\0结束操作) 5.1.1 测量字符串的长度strlen() strlen() 函数用于计算一个字符串的长度。 #include <string.h> //注意&#xff1a;该头文件必须包含 size_t strlen(const char *s); // s指的是需要测量字符串的首地…