* * * * *
[TOC]
## 简介
除了典型的基于表单的认证之外, Laravel 同时提供一种简单便捷的方式授权通过 OAuth providers 使用 [Laravel Socialite](https://github.com/laravel/socialite)。 社会化登录现在支持通过 Facebook、 Twitter、 LinkedIn、 Google、GitHub 和 Bitbucket 授权。
> {提示}其他平台的驱动器可以在 [Socialite Providers](https://socialiteproviders.github.io/) 社区驱动网站查找。
## 安装
在开始使用社会化登录功能之前,通过 Composer 将 laravel/socialite 包添加到你的项目依赖里面:
~~~
composer require laravel/socialite
~~~
## 配置
使用 Socialite 前,需要先添加上应用程序所使用的 OAuth 服务的凭证。凭证应该保存在配置文件 `config/services.php` 当中,可使用的键名有 `facebook`、`twitter`、 `linkedin`、 `google`、 `github`或 `bitbucket`,要根据你应用程序需要的提供器来确定键名。例如:
~~~
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'), // 你的 GitHub Client ID
'client_secret' => env('GITHUB_CLIENT_SECRET'), // 你的 GitHub Client Secret
'redirect' => 'http://your-callback-url',
],
~~~
> {tip} 如果 `redirect` 项的值是个相对路径,它会自动解析为全称 URL 。
## 路由
接下来,就要对用户认证了!这需要两个路由:一个路由用于把用户重定向到 OAuth 提供器,另一个则用于在认证完成后接收相应提供器的回调请求。可以通过 facade 方式 `Socialite` 来访问 Socialite:
~~~
<?php
namespace App\Http\Controllers\Auth;
use Socialite;
class LoginController extends Controller
{
/**
* 重定向用户信息到 GitHub 认证页面。
*
* @return \Illuminate\Http\Response
*/
public function redirectToProvider()
{
return Socialite::driver('github')->redirect();
}
/**
* 获取来自 GitHub 返回的用户信息。
*
* @return \Illuminate\Http\Response
*/
public function handleProviderCallback()
{
$user = Socialite::driver('github')->user();
// $user->token;
}
}
~~~
`redirect` 方法会严格地把用户信息发给 OAuth 提供器,同时 `user` 方法会读取接收到的请求数据,并从该提供器获取该用户的信息。
当然,还需要在你的控制器方法中定义好路由规则:
~~~
Route::get('login/github', 'Auth\LoginController@redirectToProvider');
Route::get('login/github/callback', 'Auth\LoginController@handleProviderCallback');
~~~
## 可选参数
很多 OAuth 提供者在重定向请求中支持可选参数。要在请求中包含可选参数, 可以通过一个关联数组调用 `with` 方法:
~~~
return Socialite::driver('google')
->with(['hd' => 'example.com'])
->redirect();
~~~
> {note} 当使用 `with` 方法时,意不要传递保留关键字,比如 `state` 或 `response_type`。
## 访问作用域
在重定向用户之前,还可以使用 `scopes` 方法在请求上添加额外的「作用域」。 该方法会合并所有提供的作用域:
~~~
return Socialite::driver('github')
->scopes(['read:user', 'public_repo'])
->redirect();
~~~
你可以使用 `setScopes` 方法覆盖所有已存在的作用域:
~~~
return Socialite::driver('github')
->setScopes(['read:user', 'public_repo'])
->redirect();
~~~
## 无状态认证
`stateless` 方法可用于禁止会话状态验证。这个方法在向 API 添加社会化身份验证时非常有用。
~~~
return Socialite::driver('google')->stateless()->user();
~~~
## 获取用户实例
有了用户实例之后,就可以获取更多用户详情:
~~~
$user = Socialite::driver('github')->user();
// OAuth Two Providers
$token = $user->token;
$refreshToken = $user->refreshToken; // not always provided
$expiresIn = $user->expiresIn;
// OAuth One Providers
$token = $user->token;
$tokenSecret = $user->tokenSecret;
// All Providers
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();
~~~
#### 从令牌中检索用户详细信息(OAuth2)
如果你已经有了一个用户的有效访问令牌,你可以使用 `userFromToken` 方法检索用户的详细信息。
~~~
$user = Socialite::driver('github')->userFromToken($token);
~~~
#### 从令牌和秘钥中检索用户详细信息(OAuth1)
如果你已经有了一个有效的用户令牌 / 秘钥,你可以使用 `userFromTokenAndSecret` 方法检索他们的详细信息:
~~~
$user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);
~~~
- 前言
- 翻译说明
- 发行说明
- 升级指南
- 贡献导引
- 入门指南
- 安装
- 配置信息
- 文件夹结构
- Homestead
- Valet
- 部署
- 核心架构
- 请求周期
- 服务容器
- 服务提供者
- Facades
- Contracts
- 基础功能
- 路由
- 中间件
- CSRF 保护
- 控制器
- 请求
- 响应
- 视图
- URL
- Session
- 表单验证
- 错误
- 日志
- 前端开发
- Blade 模板
- 本地化
- 前端指南
- 编辑资源 Mix
- 安全相关
- 用户认证
- Passport OAuth 认证
- 用户授权
- 加密解密
- 哈希
- 重置密码
- 综合话题
- Artisan 命令行
- 广播系统
- 缓存系统
- 集合
- 事件系统
- 文件存储
- 辅助函数
- 邮件发送
- 消息通知
- 扩展包开发
- 队列
- 任务调度
- 数据库
- 快速入门
- 查询构造器
- 分页
- 数据库迁移
- 数据填充
- Redis
- Eloquent ORM
- 快速入门
- 模型关联
- Eloquent 集合
- 修改器
- API 资源
- 序列化
- 测试相关
- 快速入门
- HTTP 测试
- 浏览器测试 Dusk
- 数据库测试
- 测试模拟器
- 官方扩展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Scout 全文搜索
- Socialite 社会化登录