laravel实现github登录

Author Avatar
yyq 2020-12-30 11:03:53
  • 二维码

laravel实现github登录

        laravel项目开发中经常遇到登录问题,记录下第三方github登录操作流程:

        NO1:安装扩展包socialite,执行如下命令:composer require laravel/socialite,当前要求php版本在7.2.5以上,但我的是7.2.1,所以只能指定个较低的版本安装了,命令为:composer require "laravel/socialite:2.0",安装成功后会创建目录vendor/laravel/socialite存放相关依赖,此处由于版本较低会遗留一个问题,在文件vendor/laravel/socialite/src/Two/AbstractProvider.php的方法redirect,要将$this->request()->session()->set('state', $state=$this->getState());改为$this->request()->session()->put('state', $state=$this->getState());


        NO2:然后我们需要在https://github.com申请自己的账号,Settings->Developer settings->OAuth applications注册一个APP应用,网站英文版的,英文不是很好的话可以翻译下,得到应用的Client ID,Client Secret,此处还需填写呢网站主域名Homepage Url(如:http://roast.test),回调域名 callback Url(如:http://roast.test/auth/github/callback)


        NO3:回到laravel项目,在.env配置文件下定义刚才获取的Client ID,Client Secret如下:

    GIT_CLIENT_ID=YOUR CLIENT ID
    GIT_CLIENT_SECRET=YOUR CLIENT SECRET
    GIT_REDIRECT=http://roast.test/auth/github/callback

        NO4:在conf/app.php内的provider添加 Laravel\Socialite\SocialiteServiceProvider::class, aliases内添加 'Socialite'=>'Laravel\Socialite\Facades\Socialite::class',(官方文档说高版本的laravel会自动识别,此处无需添加,但我的报找不到就加了,可自行测试)


        NO5:在conf/service.php内添加如下:

            'github'=>[

                'client_id'=>env(GIT_CLIENT_ID),

                'client_secret=>env(GIT_CLIENT_SECRET),

                'redirect'=>env(GIT_REDIRECT)

            ],


        NO6:在user表内新增字段,用于存储第三方登录用户信息相关:

            第三方名称:provider

            获取头像路径:avatar

            第三方ID:provider_id


        NO7:编写相关路由,控制器,视图文件

            a:在route/web.php下编写登录路由

                Route::get('login', 'Web\AppController@getLogin')->name('login');

            b:创建控制器及方法

                php artisan make:controller Web/AppController

                添加方法:

                public function getLogin(){

                    return view('login');

                }

            c:页面login.blade.php简单代码

                。。。

                <a href='auth/github'>

                        Log in Github

                </a>

                。。。

             d:登录认证路由

                Route::get('/auth/{socialite}', 'Web\AuthenticationController@getSocialRedirect');

                Route::get('auth/{socialite}/callback', 'Web\AuthenticationController@getSocialCallback');

            e:创建控制器及方法:

                php artisan make:controller Web/AuthenticationController

                添加方法并记得引用  use Auth; use Socialite;

                public function getSocialRedirect($account){//进入授权页

                    return Socialite::with($account)->redirect();

                }


                public function getSocialCallback($account){

                    //从第三方OAuth回调中获取用户信息

                    $socialUser = Socialite::with($account)->user();

                    //查询本地user表是否存在该用户

                    $user = User::where('provider_id', '=', $socialUser->id);

                    if(!$user){//不存在该用户,存入数据库

                        $newuser = new User();

                        $newuser->name = $socialUser->getName();

                        $newuser->email = $socialUser->getEmail()?$socialUser->getEmail():'';

                        $newuser->avatar = $socialUser->getAvatar();

                        $newuser->password = '';

                        $newuser->provider = $account;

                        $newuser->provider_id = $socailUser->getId();

                        

                        $newuser->save();

                        $user = $newuser;

                    }

                    

                    //手动登录

                    Auth::login($user);

                    //登录成功后定向到首页

                    return redirect('/');

                }

            

            NO8:当完成以上步骤后,所有流程就处理完成,还有个问题就是证书相关,需要下载个证书并添加相关路径在php.ini,不然可能会报错:cURL error 60: SSL certificate problem: unable to get local issuer certificate

            操作如下:

                a:下载路径:https://curl.haxx.se/ca/cacert.pem

                b:找到php.ini文件内的[curl]位置,设置curl.cainfo = "D:\xxx\cacert\cacert.pem",保存后重启

            


上一篇 返回列表 下一篇

发表评论

Tips:评论内容请文明用语