作者 adminz 发布于 2019-01-28 修改于

见字如面_1.开始

文档: https://laravel-china.org/docs/laravel/5.7

一、安装

1、cd c:\WWW\laravel

composer global require "laravel/installer"

laravel new zhang_words

2、打开宝塔面板,创建网站,根目录 C:\WWW\laravel\zhang_words\public ,域名 zhang_words.test,重启nginx 服务器。

修改 C:\Windows\System32\drivers\etc目录下 hosts文件,增加一行:

127.0.0.1 zhang_words.test

4、向 C:\BtSoft\WebSoft\nginx\conf\rewrite目录zhang_words.test.conf文件添加

try_files $uri $uri/ /index.php?$query_string;

重启nginx

4、浏览器访问:zhang_words.test,出现 Laravel 默认首页,但是这时还不能登录注册页

二、Auth认证

1、启用 auth

cd c:\WWW\laravel\zhang_words

php artisan make:auth

在 \routes\web.php 文件,增加了路由配置,\resources\views 增加了模板文件 ,在\app\Http\Controllers 增加了控制器文件,\database\migrations 数据库迁移文件。

其中路由 Auth::routes() 在Illuminate/Routing/Router.php 中auth类中定义的。

说明见 https://laravel-china.org/topics/9469/excuse-me-auth-routes-where-do-you-find-the-routes-that-are-extended-in-which-document-is-it-in

2、配置数据库:

修改 .env 文件

3、打开http://zhang_words.dev/login 填写任意用户名和密码,登录,提示 users 表不存在:Base table or view not found: 1146 Table 'zhang_words.users'

4、数据库迁移,运行:php artisan migrate

现在可以注册了,注册之后登录。

 

三、passport实现API授权认证

https://laravel-china.org/docs/laravel/5.7/passport/2270

https://laravelacademy.org/post/9501.html

https://liwei2.com/2018/07/18/2902.html

1、安装

composer require laravel/passport

php artisan migrate

php artisan passport:install

数据库迁移文件在 \vendor\laravel\passport\database\migrations 目录中

2、将 Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中

use Laravel\Passport\HasApiTokens;

use Notifiable, HasApiTokens;

3、打开 app/Providers/AuthServiceProvider.php,在boot方法中调用 Passport::routes 函数,令牌有效期。

use Laravel\Passport\Passport;
// Passport::routes 函数会注册发出访问令牌并撤销访问令牌、客户端和个人访问令牌所必需的路由
Passport::routes();
// token有效期
Passport::tokensExpireIn(now()->addDays(15));
// 可刷新token时间
Passport::refreshTokensExpireIn(now()->addDays(30));

4、将配置文件 config/auth.php 中授权看守器 guards 的 api 的 driver 选项改为 passport。此调整会让你的应用程序在在验证传入的 API 的请求时使用 Passport 的 TokenGuard 来处理

5、访问 http://zhang_words.test/api/v1/user 如果没有登录,会跳转到登录页 http://zhang_words.dev/login

 

Laravel Passport - 创建 REST API 用户认证

https://blog.csdn.net/gh254172840/article/details/79070575

 

6、写在api.php里面的路由,访问路径前需要加上api前辍,是在App\Providers\RouteServiceProvider在这个文件里面定义的。

7、在routes / api.php文件中创建以下路由

Route::post('login', 'API\PassportController@login');
Route::post('register', 'API\PassportController@register');
 
Route::group(['middleware' => 'auth:api'], function(){
    Route::post('get-details', 'API\PassportController@getDetails');
});

8、创建控制器  应用程序/ HTTP /控制器/ API / PassportController.php

namespace App\Http\Controllers\API;
 
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Support\Facades\Auth;
use Validator;
 
class PassportController extends Controller
{
 
    public $successStatus = 200;
 
    /**
     * login api
     *
     * @return \Illuminate\Http\Response
     */
    public function login(){
        if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){
            $user = Auth::user();
            $success['token'] =  $user->createToken('MyApp')->accessToken;
            return response()->json(['success' => $success], $this->successStatus);
        }
        else{
            return response()->json(['error'=>'Unauthorised'], 401);
        }
    }
 
    /**
     * Register api
     *
     * @return \Illuminate\Http\Response
     */
    public function register(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|email',
            'password' => 'required',
            'c_password' => 'required|same:password',
        ]);
 
        if ($validator->fails()) {
            return response()->json(['error'=>$validator->errors()], 401);           
        }
 
        $input = $request->all();
        $input['password'] = bcrypt($input['password']);
        $user = User::create($input);
        $success['token'] =  $user->createToken('MyApp')->accessToken;
        $success['name'] =  $user->name;
 
        return response()->json(['success'=>$success], $this->successStatus);
    }
 
    /**
     * details api
     *
     * @return \Illuminate\Http\Response
     */
    public function getDetails()
    {
        $user = Auth::user();
        return response()->json(['success' => $user], $this->successStatus);
    }
}

9、使用postman验证

注册API

image

登录API

image

获取Detailss API

'headers' => [
    'Accept' => 'application/json',
    'Authorization' => 'Bearer '.$accessToken,
]

image

在api路径中取消csrf验证

\app\Http\Middleware\VerifyCsrfToken.php

protected $except = [
        //跳过所有api/*路径的Csrf验证
        'api/*'
    ];

三、前端使用 Passport 自带的 Vue 组件

1、启用 vue环境

进入 Laravel 项目后,安装前端依赖库,执行 npm install ,速度慢的安装并使用淘宝镜像 cnpm

2、启用Passport 自带的 Vue 组件

php artisan vendor:publish --tag=passport-components

将 \vendor\laravel\passport\resources\js\components] 目录下的文件复制到了 [\resources\js\components\passport] 目录

3、修改 routes\web.php 新增路由模板设置为passport.blade.php

Route::get('/passport', function () {
    // return view('welcome');
    return view('passport');
});

4、\resources\js\app.js 引入组件

Vue.component('example-component', require('./components/ExampleComponent.vue').default);
// 这里要加.default属性,否则不会被导入,原因见:https://segmentfault.com/q/1010000011171159
Vue.component(
    'passport-clients',
    require('./components/passport/Clients.vue').default
);

Vue.component(
    'passport-authorized-clients',
    require('./components/passport/AuthorizedClients.vue').default
);

Vue.component(
    'passport-personal-access-tokens',
    require('./components/passport/PersonalAccessTokens.vue').default
);

5、vue.blade.php 增加组件:

<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" href="/css/app.css">
    <title>Laravel + vue</title>
</head>
<body>
<div id="app">
    <example-component></example-component>
    <passport-clients></passport-clients>
    <passport-authorized-clients></passport-authorized-clients>
    <passport-personal-access-tokens></passport-personal-access-tokens>
</div>
</body>
<script src="/js/app.js"></script>
</html>

6、编译:npm run dev

浏览器打开首页

 

手摸手,教你使用 laravel-passport 实现 oauth 2.0 验证机制

https://www.jianshu.com/p/cae5ab919535

PS C:\WWW\laravel\zhang_words> php artisan passport:client

 Which user ID should the client be assigned to?:
 > 1

 What should we name the client?:
 > Test Client

 Where should we redirect the request after authorization? [http://zhang_words.dev/auth/callback]:
 >

New client created successfully.
Client ID: 3
Client secret: XcHdD0MfCBckY9oaFT08NVC8GaPaL4YvJar3KDNV

 

四、Token认证

1、获取 code 码

浏览器打开:

http://zhang_words.test/oauth/authorize?client_id=3&redirect_uri=http%3A%2F%2Fzhang_words.test%2Fcallback&response_type=code&scope=

可以得到code码,然后等换到token,如果用 Postman 获取,参数如下:

[
        'client_id' => '12',
        'redirect_uri' => 'http://127.0.0.1:8000/callback',
        'response_type' => 'code',
        'scope' => '',
    ]

2、换取 access_token 令牌

在 Postman 中请求类型是 post ,地址是 http://zhang_words.test/oauth/token ,在 body 选项卡,添加刚才请求到的 code 码,以及客户端 id 、secret、redirect 做为参数,发送请求可换取到 access_token,参数如下所示:

'form_params' => [
            'grant_type' => 'authorization_code',
            'client_id' => 'client-id',
            'client_secret' => 'client-secret',
            'redirect_uri' => 'http://example.com/callback',
            'code' => $request->code,
        ],

3、再用 access_token 添加到 header 就可以请求到授权资源了

accept: application/json
Authorization: Bearer access_token

在 Postman 中请求,选择 Authorization ,type选择 Bearer token ,在 code 中填入刚请求到的 access_token ,即可请求到需要授权的资源。

4、刷新访问令牌 接口与 获取访问令牌 接口一样,只是参数不同。参数如下

grant_type —— 刷新令牌固定为 refresh_token;
client_id —— 通过 passport:client 创建的客户端 id;
client_secret —— 通过 passport:client 创建的客户端 secret;
refresh_token —— 刷新令牌;
scope —— 作用域,可填写 * 或者为空;
 
'form_params' => [
        'grant_type' => 'refresh_token',
        'refresh_token' => 'the-refresh-token',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'scope' => '',
    ],

五、密码授权模式

https://www.jianshu.com/p/ae9337f0863e

1、运行命令:php artisan passport:client --password

2、参数:

grant_type —— 密码模式固定为 password;
client_id —— 通过 passport:client 创建的客户端 id;
client_secret —— 通过 passport:client 创建的客户端 secret;
username —— 登录的用户名,数据库中任意用户邮箱;
password —— 用户密码;
scope —— 作用域,可填写 * 或者为空;

 

参考:

Laravel Passport 里的授权类型介绍

https://www.v2ex.com/t/440904

Laravel Passport 学习整理:四种模式使用总结

https://learnku.com/articles/6404/laravel-passport-learning-finishing

laravel之passport oauth2认证之授权码详解

https://www.jianshu.com/p/3df8b2b6d533

一张图看懂laravel的API(passport)工作流程

https://segmentfault.com/a/1190000012061067