Passport(Laravel5.5.*)密码授权简单使用

1、安装 laravel 项目:

composer create-project laravel/laravel lhuaxi2 --prefer-dist "5.5.*";

安装完后配置好数据库等信息。

2、使用 Composer 安装 Passport :

composer require laravel/passport:~4.0;

注意 Laravel 5.6 已经发布,最新的 laravel/passport 版本为 5.0 适配 Laravel 5.6,所以我们需要使用 Laravel 5.5 的适配版本 4.0
(1)、安装成功之后,我们需要设置他们的服务提供者,所以打开config/app.php文件,并在其中添加以下代码

'providers' => [
    '''
    Laravel\Passport\PassprotServiceProvider::class,
],

注: laravel5.5 以上版本可以忽略这一步骤,此步骤争对 5.5 以下版本。

3、生成数据表:

  Passport 扩展包里已经自动注册了迁移文件加载,执行 migrate,会自动运行扩展包里的迁移文件,由此来创建存储客户端和令牌的数据表:
file

4、创建加密秘钥:

接下来,运行 php artisan passport:keys 命令来创建生成安全访问令牌时所需的加密密钥:

$ php artisan passport:keys

file

执行成功后,会在 storage 目录中看到两个以 oauth 开头的秘钥文件:
file

5、创建客户端:

 $ php artisan passport:client --password --name='huaxi-ios'

passport:client 命令可以创建一个客户端,由于我们使用的是密码模式,所以需要增加 --password 参数。同时还可以增加 --name参数为客户端起个名字,我们这里起名为 lhuaxi2-ios
file
命令行中已经输出了创建的 client_idclient_secret,我们找个地方复制保存起来。
6、创建控制器AuthorizationsController,命令:php artisan make:controller Api\\AuthorizationsController
AuthorizationsController中编写代码:

<?php

 namespace App\Http\Controllers\Api;

 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
 use Psr\Http\Message\ServerRequestInterface;
 use Zend\Diactoros\Response as Psr7Response;
 use Psr\Http\Message\ServerRequestInterface;
 use League\OAuth2\Server\Exception\OAuthServerException;
 use League\OAuth2\Server\AuthorizationServer;
 use Illuminate\Support\Facades\Auth;

 class AuthorizationsController extends Controller
 {
     public function getAccessToken(AuthorizationServer $server, ServerRequestInterface $serverRequest)
       {
      try {
            return $server->respondToAccessTokenRequest($serverRequest, new Psr7Response)->withStatus(201);
        } catch (OAuthServerException $e) {
             return $this->response->errorUnauthorized($e->getMessage());
      }
       }

      public function getUserInfo()
      {
            $user = Auth::user();
            return $user;
        }
 } 

7、在api.php中加一条测试路由:

Route::group(['middleware' => 'auth:api'], function(){
   Route::post('get_user_info', 'Api\AuthorizationsController@getUserInfo');
 });
Route::post('get_access_token', 'Api\AuthorizationsController@getAccessToken');

8、令牌获取:
(1).获取访问令牌
  密码模式我们通过 http://lhuaxi2.com/api/get_access_token这个路由获取访问令牌。提交的参数如下:
  grant_type —— 密码模式固定为 password
  client_id —— 通过 passport:client 创建的客户端id
  client_secret —— 通过 passport:client创建的客户端 secret
  username —— 登录的用户名,数据库中任意用户邮箱;
  password —— 用户密码;
  scope —— 作用域,可填写 * 或者为空;
file
   提交正确的 client 信息以及任意已存在用户的用户名和密码,可以正确的获取到访问令牌。

  token_type —— 令牌类型;
  expires_in—— 多长时间后过期;
  access_token —— 访问令牌;
  refresh_token —— 刷新令牌;
(2).刷新访问令牌
  刷新访问令牌 接口与 获取访问令牌 接口一样,只是参数不同。
  grant_type —— 刷新令牌固定为 refresh_token
  client_id —— 通过 passport:client 创建的客户端id
  client_secret —— 通过 passport:client 创建的客户端 secret
  refresh_token —— 刷新令牌;
  scope —— 作用域,可填写 * 或者为空;
file
刷新令牌不用提交用户的用户名和密码,而是直接使用 refresh_token 换取新的访问令牌,注意修改 grant_typerefresh_token
9、把获取用户信息的接口放在api中间件外面就获取不到用户信息的:
file
返回结果:
file
把这条路由放回api中间件里面:
返回结果:
file
file
passport简单使用,欢迎大家一起改进学习,发布更好文章,一起进步。谢谢!

本作品采用《CC 协议》,转载必须注明作者和本文链接

eiomi

本帖由系统于 5个月前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 4

请问楼主,我使用同样的代码 测试后 返回的是
The authorization grant type is not supported by the authorization server.
另外laravel版本是5.7 我自己通过密码授权获取到的 refresh_token 为何过不了auth:api的认证. 总会跳转到302 到登录.
Route::post('/auth_password', function (Request $request) { $http = new \GuzzleHttp\Client(); $api_domain = config('domain.api_domain'); $response = $http->post($api_domain . '/oauth/token', [ 'form_params' => [ 'grant_type' => 'password', 'client_id' => '2', 'client_secret' => 'BxT9HbrextQsNloanbBqRVeoeVFheEYpmTyDcxq1', 'username' => '13800001111', 'password' => '123456', 'scope' => '', ], ]); return json_decode((string)$response->getBody(), true); });
代码可以获取到 token信息.
但是拿token 过不了auth 中间件
Route::group(['middleware' => 'auth:api'], function(){
Route::post('get_user_info', 'AuthorizationsController@get_token');
});

感谢

1年前 评论

@Camellias 注意测试字段不要有空格

1年前 评论

@EDISONYANG
测试了 Authorization:Bearer+token 和 Authorization:Bearer+" "+token
返回结果是一样 ,没有通过 Route::group(['middleware' => 'auth:api'],function(){
Route::post('get_user_info', 'AuthorizationsController@get_token');
})
We are sorry, but Chrome API does not allow to get a response body for redirect.

1年前 评论
likunyan

这个怎么删除token

$http->delete('http://127.0.0.1:8000/oauth/tokens/b7de029820933e510d16522a6f807cdf46f8b82d91f05f0778c959948336cf2d3942f142d40c2b42'`); 

不行

3个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!