2016年9月1日 星期四

在 Laravel 中使用 OAuth2 初步配置

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.phpapi.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

沒有留言:

wibiya widget