laravel实现github登录
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",保存后重启