柔晶美网络工作室

柔晶美网络工作室,倾心于web技术的博客站点

关注我 微信公众号

您现在的位置是: 首页 >  博客日记

利用QQ互联多个回调地址,让同一域名前台后台登录共用key登录的方法

2020-01-11 admin php  1534

需求:前台登录和后台登录地址不同,都需要使用qq互联登录,且共用一套KEY,如何实现?经过两天的研究,发现qq互联回调地址可以填写多个,这样,原有的前台QQ互联登录无需修改,只需要添加一个回调地址,并用分号分割:

接下来,在配置文件,比如laravel .env文件中,添加一个回调地址QQ_REDIRECT_URI2:

//QQ登录配置
QQ_KEY=
QQ_SECRET=
QQ_REDIRECT_URI=https://blog.dzbfsj.com/qqlogin
QQ_REDIRECT_URI2=https://blog.dzbfsj.com/admin/qqlogin

然后,在后台登录控制器中,以laravel-admin为例,AuthController.php文件添加一个方法,用于qq互联登录:

//QQ一键登录
public function qqlogin(Request $request)
{
header("Content-Type: text/html;charset=utf-8");
$app_id = env('QQ_KEY');
$app_secret = env('QQ_SECRET');
$my_url = env('QQ_REDIRECT_URI2');
//Step1:获取Authorization Code
if (!isset($request->code)){
//state参数用于防止CSRF攻击,成功授权后回调时原样带回
$state = md5(uniqid(rand(), TRUE));
session(['state'=>$state]);
$dialog_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=".$app_id."&redirect_uri=".urlencode($my_url)."&state=".$state;
Header("Location: $dialog_url");
}elseif($request->state == session('state')) {
//Step2:通过Authorization Code获取Access Token
$token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&"."client_id=".$app_id."&redirect_uri=".urlencode($my_url)."&client_secret=".$app_secret."&code=".$request->code;
$response = file_get_contents($token_url);
//如果用户临时改变主意取消登录,返回true!==false,否则执行step3  
if (strpos($response, "callback") !== false) {
$lpos = strpos($response, "(");
            $rpos = strrpos($response, ")");
            $response = substr($response, $lpos + 1, $rpos - $lpos -1);
            $msg = json_decode($response);
            if (isset($msg->error)) {
                echo "

error:

".$msg->error;                 echo "

msg :

".$msg->error_description;                 exit;             }         } $params = array(); parse_str($response, $params);//把传回来的数据参数变量化 //set access token to session $token = $params["access_token"]; $graph_url = "https://graph.qq.com/oauth2.0/me?access_token=$token"; $str  = file_get_contents($graph_url); if (strpos($str, "callback") !== false) { $lpos = strpos($str, "("); $rpos = strrpos($str, ")"); $str  = substr($str, $lpos + 1, $rpos - $lpos -1); } $user = json_decode($str); if (isset($user->error)) { echo "

error:

" . $user->error; echo "

msg  :

" . $user->error_description; exit; } //debug //echo("Hello " . $user->openid); $openid = $user->openid; if($openid){ //查找数据库中是否有该openid $check = AdminUserModel::where('qqid', $openid)->first(); if (!$check) {//如果第一次访问,跳转到绑定账号页面         $bd = url("/admin/bdyyzh?timestamp=".time()."&qqid=".$openid); return redirect($bd); } else { //登录             $this->guard()->login($check);                 admin_toastr(trans('admin.login_successful'));                 $request->session()->regenerate();                 return redirect()->intended($this->redirectPath());         } }else{ echo '没有获取到openid'; } }else{ echo "The state does not match. You may be a victim of CSRF."; } }

登录流程是,qq互联用户授权,获取到openid,数据库查询是否存在,不存在则跳转到绑定页面,存在则直接登录到后台。

本站使用了三个登录:微信、QQ、短信,因此在绑定账号时,也相应的进行绑定:

//绑定已有账号
public function bdyyzh(Request $request){
if(isset($request->qqid)){
$qqid = $request->qqid;
return view('auth/adminbduser',compact('qqid'));
}elseif(isset($request->openid)){
$openid = $request->openid;
return view('auth/adminbduser',compact('openid'));
}elseif(isset($request->phone)){
$phone = $request->phone;
return view('auth/adminbduser',compact('phone'));
}
        //session()->flash('success', 'QQ登录成功!');
//return redirect()->route('cxsy');
}
//查询账号密码,如账号密码正确则更新qqid或openid或phone
public function cxbd(Request $request){
//dd($request->all());
$this->loginValidator($request->all())->validate();
$credentials = $request->only([$this->username(), 'password']);
        $remember = $request->get('remember', false);
if ($this->guard()->attempt($credentials, $remember)) {
//验证通过
if(isset($request->qqid)){
$qqid = $request->qqid;
AdminUserModel::where('username', $request->username)->update(['qqid' => $qqid]);
}elseif(isset($request->openid)){
$openid = $request->openid;
AdminUserModel::where('username', $request->username)->update(['openid' => $openid]);
}elseif(isset($request->phone)){
$phone = $request->phone;
AdminUserModel::where('username', $request->username)->update(['phone' => $phone]);
}
//保存session并跳转到后台
            return $this->sendLoginResponse($request);
        }else{
        session()->flash('danger', '很抱歉,您的用户名和密码不匹配!');
        return redirect()->back()->withInput();
        }
}

如此,则实现了前台和后台共用一套key进行互联登录。


上一篇 Laravel-admin重写后台登录逻辑,新增字段实现第三方登录绑定功能

下一篇 laravel-admin使用短信验证码登录后台的方法

文章评论


需要 登录 才能发表评论
热门评论
0条评论

暂时没有评论!

猜你喜欢

  • 英雄

    英雄

  • 工资两三千,你的未来在哪里?

    工资两三千,你的未来在哪里?

  • 心理咨询师201705考试划重点

    心理咨询师201705考试划重点

  • 学校的学习与社会的学习有什么不同?

    学校的学习与社会的学习有什么不同?

  • Dcat admin使用阿里云oss时,使用内网上传,外网访问的方法

    Dcat admin使用阿里云oss时,使用内网上传,外网访问的方法

  • 于都驾考科目三模拟灯光

    于都驾考科目三模拟灯光

标签云

    php laravel 文学 vba linux python mysql windows 前端 小程序 公众号 其它 vue golang

深圳SEO优化公司罗湖高端网站设计哪家好扬州品牌网站设计报价扬州百度竞价多少钱湛江外贸网站设计柳州推广网站推荐广东建网站哪家好泸州seo报价松岗网站搜索优化多少钱南充如何制作网站多少钱福永网站优化软件广安网站定制多少钱常德网站推广方案价格武威网站推广价格邵阳网站设计哪家好黄冈阿里店铺运营价格平湖关键词按天计费公司毕节关键词排名包年推广价格新乡百姓网标王公司商洛百度关键词包年推广推荐长治seo网站推广推荐宜春建站哪家好铁岭企业网站改版报价松岗网站制作报价黄冈seo排名公司白城网站推广系统报价抚顺网站建设哪家好潮州营销网站价格濮阳关键词按天收费报价天门模板制作常州百搜标王哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化