2016年10月3日 星期一

使用 Github 等第三方帐号登录 Laravel 应用

Laravel 的 Socialite 使得使用 Facebook、Twitter、Google、LinkedIn、GitHub 以及 Bitbucket 等第三方帐号登录 Larave 应用变得很容易实现。你可以把它们与已存在的用户进行第三方连接,也可以作为主登录机制。虽然 官方文档 中给出了一些步骤,但是很多朋友看完后依然不知道具体如何实现登录功能。今天我们以 Github 为例,详细列出其实现方法。

1. 安装 Socialite

通过 Composer 命令行安装:
  1. $ composer require laravel/socialite
然后把其注册到 config/app.php 中:
  1. 'providers' => [
  2. ...
  3. Laravel\Socialite\SocialiteServiceProvider::class,
  4. ...
  5. ],
  6.  
  7. 'aliases' => [
  8. ...
  9. 'Socialite' => Laravel\Socialite\Facades\Socialite::class,
  10. ...
  11. ],
现在 Socialite 已经注册到你的应用中了,下面我们来设置证书。

2. 创建 Github 应用

首先,你需要拥有一个 Github 帐号,之后到“Setting”–“OAuth applications”–“Developer applications”–“Register new application”,创建一个 OAuth 应用:
register-github-app
之后填写应用的信息:
github-app-setting
其中的“Authorization callback URL”我们这里设置为“http://your-domain-name.com/auth/github/callback”,你需要根据你的应用实际来填写。创建完成之后在应用的详细页面就可以看到“Client ID”和“Client Secret”的值了。
github-app-key

3. 服务配置

打开 config/services.php 文件,在其中添加 Github 授权信息:
  1. 'github' => [
  2. 'client_id' => 'your-github-app-id',
  3. 'client_secret' => 'your-github-app-secret',
  4. 'redirect' => 'http://your-callback-url',
  5. ],
把第二步创建应用的“Client ID”和“Client Secret”以及“Authorization callback URL”的值填到上面。当然,你也可以在 .env 文件中定义三个环境变量,然后在 config/services.php 中通过env() 函数获取。

4. 定义路由

在 routes.php 中添加下面的路由(你可以自定义为任何名称,这里为方便起见直接定义为下面的名称):
  1. Route::get('auth/github', 'Auth\AuthController@redirectToProvider');
  2. Route::get('auth/github/callback', 'Auth\AuthController@handleProviderCallback');
下面我们来完成控制器中的这几个方法。

5. 控制器方法

在 Auth\AuthController 中添加下面方法:
  1. public function redirectToProvider()
  2. {
  3. return Socialite::driver('github')->redirect();
  4. }
  5.  
  6. public function handleProviderCallback()
  7. {
  8. try {
  9. $user = Socialite::driver('github')->user();
  10. } catch (Exception $e) {
  11. return Redirect::to('auth/github');
  12. }
  13.  
  14. $authUser = $this->findOrCreateUser($user);
  15.  
  16. Auth::login($authUser, true);
  17.  
  18. return redirect('/');
  19. }
  20.  
  21. private function findOrCreateUser($githubUser)
  22. {
  23. if ($authUser = User::where('github_id', $githubUser->id)->first()) {
  24. return $authUser;
  25. }
  26.  
  27. return User::create([
  28. 'name' => $githubUser->name,
  29. 'email' => $githubUser->email,
  30. 'github_id' => $githubUser->id,
  31. 'avatar' => $githubUser->avatar
  32. ]);
  33. }
上面只是实现的一般方法,当然你也可以按照自己的方法来实现。首先跳转到 Github,获得用户授权后再跳转回来到,然后根据 Github ID 查找用户并登录,或者创建一个新的用户。

6. 数据库设计

我们需要修改 users Migration 以便存储一些 Github 特定的信息。Github 会给我们返回很多信息,我们这里选择其中的一些进行存储。
  1. $table->increments('id');
  2.  
  3. $table->string('github_id')->unique();
  4. $table->string('name');
  5. $table->string('email');
  6. $table->string('avatar');
  7.  
  8. $table->rememberToken();
  9. $table->timestamps();
由于我们这里是用于演示的,所以直接更改为了上面的样子,你可以根据你的实际需求来设计。Github 为我们返回的信息大致如下:
github-authorized-user

7. User Eloquent

修改 User Eloquent Model 以便能够存储 Github 的信息:
  1. protected $fillable = ['name', 'email', 'github_id', 'avatar'];
下面我们来看看上面的这些代码是如何具体运行的。

8. 使用

在需要登录的地方添加下面的链接,其目标地址指向我们上面添加的路由 auth/github
sign-in-github
当用户点击上面的按钮的时候,会跳转到 Github 授权页面,询问用户是否运行授权,当用户允许之后,会跳转回 auth/github/callback ,也就是我们创建应用时填写的“Authorization callback URL”。
laravel-github-authorize
之后就会执行回调函数中的代码,登录已经存在的用户,或者创建一个新的用户并登录。
现在我们已经拥有一个经过 Laravel 授权的用户了,可以直接使用 Auth 提供的所有方法,如Auth::check()Auth:user() 等。你还可以添加一个 logout 路由来运行Auth::logout() 方法退出登录。之后的操作就可以同使用 Laravel 自带的认证系统一样了。
以上便完成了使用 Github 帐号登录 Laravel 应用的所有步骤,其他第三方应用的实现基本类似。

from : http://9iphp.com/web/laravel/laravel-social-authentication-with-github.html

沒有留言:

wibiya widget