dingo/api
这是一个基于 composer 开发的用于管理 api 的一个工具,具体的配置:
https://github.com/dingo/api/wiki
lucadegasperi/oauth2-server-laravel
这时一个基于 composer 开发的用于 oauth2 二次开发的一个工具包,具体的配置:
https://github.com/lucadegasperi/oauth2-server-laravel/wiki
具体应用
本文不再赘述这两个组件的安装及配置,在下文之前,我们默认安装完成,迁移文件也已经执行。
原理说明
在这两个组件中,
dingo/api
主要的作用是为 Web Api
服务提供统一的管理。而在这篇文章中,我们主要用到这个组件 oauth2
的部分。配合 lucadegasperi/oauth2-server-laravel
来完成完整的移动应用与后端的验证通信过程。本文的例子采用的是 password
的验证方法。具体实现
在安装完成之后,在项目中会多出
oauth2.php
, api.php
等配置文件。我们的配置也将从这些文件展开。lucadegasperi/oauth2-server-laravel
这个组件主要是完成 oauth2
的具体验证和令牌的分发。在这次的实例中,我们采用的是 password
的验证方法,所以要在 oauth2.php
中做如下的配置:'grant_types' => [
'password' => [
'class' => 'League\OAuth2\Server\Grant\PasswordGrant',
'access_token_ttl' => 604800,
// the code to run in order to verify the user's identity
'callback' => '\App\Repositories\Verifier@verify'
],
'refresh_token' => [
'class' => 'League\OAuth2\Server\Grant\RefreshTokenGrant',
'access_token_ttl' => 3600,
// the refresh token time to live
'refresh_token_ttl' => 604800,
// whether or not to issue a new refresh token when a new access token is issued
'rotate_refresh_tokens' => false,
],
],
在以上配置中我们配置了基本的验证规则以及令牌刷新的方法,简单明了。注意到上面有一个
callback
方法,这个方法是用来贵基本的用户名密码进行验证的一个方法,具体实现如下:class Verifier {
public function verify($username, $password)
{
$credentials = [
'phone' => $username,
'password' => $password,
];
if (Auth::once($credentials))
{
return Auth::user()->id;
}
return false;
}
}
在以上的验证完成之后,就可以对客户端发送令牌:
Route::post('oauth/access_token', function() {
return Response::json(Authorizer::issueAccessToken());
});
具体参数如下:
grant_type: password
client_id: test_id
client_secret: test_secret
username: rayjun
password: 12345
下面是一个返回的例子:
{
"access_token": "2YotnFZFEjr1zCsicMWpAA",
"expires_in": 3600,
"token_type": "bearer",
"refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
"user_id": 1
}
然后需要在
config/api.php
中配置 oauth2
的验证方式: 'oauth' => function ($app) {
$provider = new Dingo\Api\Auth\Provider\OAuth2($app['oauth2-server.authorizer']->getChecker());
$provider->setUserResolver(function ($id) {
// Logic to return a user by their ID.
});
$provider->setClientResolver(function ($id) {
// Logic to return a client by their ID.
});
return $provider;
}
完成以上的配置基本就完成
oauth2
在 laravel
中的配置了。当然要在 routes.php
中指定要保护的路由,这一功能由 dingo/api
帮助实现。如下:$api->group(['protected' => true],function($api){
//需要保护的路由
});
在
laravel
使用 oauth2
中的配置基本完成了。注意
以上的配置都是在以
nginx
为服务器的情况下配置的,如果你使用的是 Apache
服务器,那么还需要重写规则,在 .htaccess
文件中加入以下的代码:#Authorization Headers
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
reference : https://phphub.org/topics/1159
沒有留言:
張貼留言