文档章节

laravel 5.4 + dingo api + jwt 代替Passport

x
 xinshijue6080
发布于 2017/08/02 10:34
字数 1242
阅读 15
收藏 0
点赞 0
评论 0

由于在度娘找了半天根本一大堆Copy版本,弄得我死去活来的,每个都试了一堆问题,到底你们做完有没有总结过一次?然后有几个使用lunmen+dingo api+jwt,完全不行啊,太监版不是我想要的。
后来Google,终于找到例子并实测成功。直接来了

新装一个LV

composer create-project --prefer-dist laravel/laravel myApiProject

安装dingo api

在composer.json中添加

composer require dingo/api:1.0.x@dev

config/app.php

 'providers' => [
     //前面很多
    Dingo\Api\Provider\LaravelServiceProvider::class,
]

发布配置文件
终端运行

 php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

打开.env文件,把dingo的配置放到最后面

API_STANDARDS_TREE=vnd // 环境
API_SUBTYPE=myapp // 子类型
API_PREFIX=api // 前缀
API_DOMAIN=api.myapp.com //子域名  (前缀和子域名只能存在一个)可选
API_VERSION=v1 // 版本
API_NAME=My API // 名字(使用API Blueprint命令才会用到)
API_CONDITIONAL_REQUEST=false // 带条件的请求
API_STRICT=false // Strict模式
API_DEFAULT_FORMAT=json // 响应格式
API_DEBUG=true // 调试模式

下面是我的配置:

API_STANDARDS_TREE=vnd
API_SUBTYPE=emall
API_PREFIX=api
API_VERSION=v1

没必要每个都配上去,主要的配一下就可以了

安装jwt

还是composer.json

"require-dev": {
    "tymon/jwt-auth": "1.0.*"
},
"minimum-stability": "dev",
"prefer-stable": true 

其实只需要加上,下面是我的写法,上面是国外的写法

   "tymon/jwt-auth": "1.0.*@dev"

运行composer update将dingo和jwt装上去

添加jwt的认证
config/api.php添加内容

'auth' => [
    'jwt' => Dingo\Api\Auth\Provider\JWT::class
]

config/app.php

'providers' => [
    // 前面很多
    Tymon\JWTAuth\Providers\LaravelServiceProvider::class
],

'aliases' => [
    // 前面很多
    'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class
]

在终端运行:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

会生成config/jwt.php 这是jwt的配置文件

生成jwtkey.env文件运行:

php artisan jwt:secret


路由

routers/api.php
中新建内容,两个路径分别是注册和登录:

//这句接管路由
$api = app('Dingo\Api\Routing\Router');

$api->version('v1', function ($api) {

 $api->post('login', 'App\Http\Controllers\Api\Auth\LoginController@login');
 $api->post('register', 'App\Http\Controllers\Api\Auth\RegisterController@register');

}); 

生成两个controller
终端输入:


php artisan make:controller App\\Http\\Api\\Auth\\LoginController
php artisan make:controller App\\Http\\Api\\Auth\\RegisterController  

数据库

备置.env文件

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=databasename
DB_USERNAME=root
DB_PASSWORD=

添加迁移文件,当然你也可以使用php artisan make:auth 安装LV自带的用户
下面我们用新建的吧
终端运行:

php artisan make:model User -m 

此命令可以添加迁移文件同时添加Model
迁移文件一般在database/migrations/时间格式_create_users_table.php
打开迁移文件修改以下内容:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name')->unique();
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

终端运行:php artisan migrate创建users

打开我们新建的ModelApp/User.php
添加如下内容:

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * Get the identifier that will be stored in www.10rz.net the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

注册

在之前建的App/Http/Controller/Api/Auth/RegisterController.php
添加如下内容:

use App\Http\Controllers\Controller;
use App\User;
use Dingo\Api\Exception\StoreResourceFailedException;
use Dingo\Api\Routing\Helpers;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Tymon\JWTAuth\Facades\JWTAuth;

class RegisterController extends Controller
{
    use RegistersUsers;
    use Helpers;

    public function register(Request $request){

        $validator = $this->validator($request->all());
        if($validator->fails()){
            throw new StoreResourceFailedException("Validation Error", $validator->errors());
        }

        $user = $this->create($request->all());

        if($user){

            $token = JWTAuth::fromUser($user);

            return $this->response->array([
                "token" => $token,
                "message" => "User created",
                "status_code" => 201
            ]);
        }else{
            return $this->response->error("User Not Found...", 404);
        }
    }

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|unique:users',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:6',
        ]);
    }

    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }

}

打开Postman进行测试地址:http://127.0.0.1/myApiProject...

登录

在之前建的App/Http/Controller/Api/Auth/LoginController.php

use App\User;
use Dingo\Api\Routing\Helpers;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Tymon\JWTAuth\Facades\JWTAuth;

class LoginController extends Controller
{
    use AuthenticatesUsers;
    use Helpers;

    public function login(Request $request){

        $user = User::where('email', $request->email)->orWhere('name', $request->email)->first();

        if($user && Hash::check($request->get('password'), $user->password)){
            $token = JWTAuth::fromUser($user);
            return $this->sendLoginResponse($request, $token);
        }

        return $this->sendFailedLoginResponse($request);
    }

    public function sendLoginResponse(Request $request, $token){
        $this->clearLoginAttempts($request);

        return $this->authenticated($token);
    }

    public function authenticated($token){
        return $this->response->array([
            'token' => $token,
            'status_code' => 200,
            'message' => 'User Authenticated'
        ]);
    }

    public function sendFailedLoginResponse(){
        throw new UnauthorizedHttpException("Bad Credentials");
    }

    public function logout(){
        $this->guard()->logout();
    }
 }

打开Postman进行测试地址:http://127.0.0.1/myApiProject...

可以看到我们得到了token

拉取用户信息

routers/api.php添加

$api->group(['middleware' => 'api.auth'], function ($api) {
    $api->get('user', 'App\Http\Controllers\Api\UsersController@index');
});

终端运行:

php artisan make:controller App\\Http\\Controllers\\Api\\UsersController

UsersController.php中添加

namespace App\Http\Controllers\Api;

use Dingo\Api\Routing\Helpers;
use Illuminate\Routing\Controller;

class UsersController extends Controller
{
    use Helpers;

    public function __construct()
    {
        $this->middleware('api.auth');
    }
    public function index(){
//        return User::all();
        $user = $this->auth->user();

        return $user;
    }
}

打开Postman进行测试地址:http://127.0.0.1/myApiProject...
注意因为我们设定了需要token才能拉取数据,所以在请求头Header
我们添加了:Authorization :Bearer + token
Bearer是一种token_type在源码中有提到,应该是一种标准

© 著作权归作者所有

共有 人打赏支持
x
粉丝 0
博文 7
码字总数 11041
作品 0
石家庄
OAuth 及 移动端鉴权调研

OAuth OAuth是一个解决用户无需向第三方应用提供用户名密码,让第三方应用访问用户私密资源的授权方案。 举例: 用户a,在网站B存有私密信息(年龄、邮箱、头像),而a在访问第三方网站C时,为...

马肱 ⋅ 05/15 ⋅ 0

Laravel 5.4+ Dingo +Jwt 快速搭建 API系统

执行安装 配置项目 config/app.php config/api.php 发布配置文件 : 终端执行 生成 jwt key 写入.env 在 .env 中,把 dingo 配置在最后 上面的配置不是都是必要的,可根据实际情况进行选择(上...

指尖芳华 ⋅ 05/01 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更小一点,我设置...

等月人 ⋅ 昨天 ⋅ 0

tomsun28/bootshiro

bootshiro 自己在前后端分离上的实践 要想实现完整的前后端分离,安全这块是绕不开的,这个系统主要功能就是动态restful api管理,这次实践包含两个模块,基于搭建的权限管理系统后台bootshi...

tomsun28 ⋅ 04/25 ⋅ 0

Json Web Token介绍与基本使用

一、Session与JWT 1.1 传统Cookie+Session +的存在主要是为了解决HTTP这一下服务器如何识别用户的问题。 其原理就是在用户登录通过验证后,服务端将数据加密后保存到客户端浏览器的Cookie中,...

yuanlaijike ⋅ 05/03 ⋅ 0

八幅漫画理解使用 JWT设计的单点登录系统

上次在《JSON Web Token - 在Web应用间安全地传递信息》中我提到了JSON Web Token可以用来设计单点登录系统。我尝试用八幅漫画先让大家理解如何设计正常的用户认证系统,然后再延伸到单点登录...

John Wu ⋅ 04/18 ⋅ 0

SpringBoot 整合 oauth2(五)实现 jwt 及 扩展

什么是jwt,即 json web token。JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。也是一种token,但是和token有一些不同。 jwt优点: 自包含 防篡改 可自定义扩展 JW...

FantJ ⋅ 05/22 ⋅ 0

SpringBoot--JWT集成配置

一, JWT简介 JWT 全名 JSON WEB Token 主要作用为用户身份验证, 广泛应用与前后端分离项目当中. JWT 的优缺点 : https://www.jianshu.com/p/af8360b83a9f 二, JWT 在 spring boot 项目当中的...

ge洋 ⋅ 05/19 ⋅ 0

如何给express-jwt的unless方法加上http-method(get,post...)限制条件

根据express-jwt官方说明文档,我们可以在总路由上加上jwt验证,同时在那些不想加验证的路由上使用去除验证,如下: 这样就不用每条路由挨个去加jwt验证了,方便了不少。但是在使用过程中发现...

Angeladaddy ⋅ 04/09 ⋅ 0

年薪20万Python工程师进阶(1):Django-第三方登录框架

1.安装 pip install social-auth-app-django 2.配置 INSTALLED_APPS=( ... 'social_django', ... ) 3.数据生成,直接migrate,因为源码中的 makemigrtasion 生成的数据库迁移文件已经存在了。...

程序员八阿哥 ⋅ 05/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

门面模式

1. 门面模式定义理解 是比较常用的封装模式,也称为外观模式; 标准定义:Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface t...

liuyan_lc ⋅ 23分钟前 ⋅ 0

SpringCloud 微服务 (九) Spring Cloud Bus

壹 本篇结合上篇学习使用SpringCloud Bus结合MQ来实现自动刷新 上篇有远端git码云,本地git,config统一配置中心服务,order服务,product服务 过程: 启动服务时,config服务将远端git的配置拉取到...

___大侠 ⋅ 24分钟前 ⋅ 0

别被别人抢走了你的时间!

前两天,有读者在评论区给我留言,问我类似于 618、双十一这样的电商狂欢,我会参与么? 我给他的回复很直接,我很少参与这类活动,尤其是一些整点抢券的行为,更加不会参与,因为我的时间很...

古乙丁三雨 ⋅ 29分钟前 ⋅ 0

nginx开启gzip压缩JS文件失败?

检查下GZIP设置的压缩的文件类型有没有application/x-javascript,在服务器在传送JavaScript文件时使用的MIME类型通常是这个.

hang1989 ⋅ 29分钟前 ⋅ 0

DockOne微信分享(一二九):聊聊Service Mesh:linkerd

【编者的话】随着企业逐渐将传统的单体应用向微服务或云原生应用的转变,虽然微服务或者云原生应用能给企业带来更多的好处,但也会带来一些具有挑战的问题,如怎么管理从单体应用转向微服务所...

xiaomin0322 ⋅ 34分钟前 ⋅ 0

linear regression

今天分享一个很经典的ML算法---LIner regression(线性回归) **线性回归(Linear regression)**是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归...

gfjjfuy112 ⋅ 36分钟前 ⋅ 0

百度地图使用经验-第1集:成功展现第1个地图

第1步:引入js(携带密钥) 第2步: 创建一个div 第3步: 写js 类: js自己的面向对象的特点; ES6 PHP,JAVA,C++ 插曲:事件 22小时前 事件和函数的区别: 函数是事先写好函数体,手工调用。...

宁哥实战课堂 ⋅ 38分钟前 ⋅ 0

sudo java : command not found

运行sudo java报错 $ sudo java$ sudo: java:找不到命令 解决方案: sudo命令后加-E,保留用户运行环境的环境变量。 sudo -E env PATH=$PATH java...

勇敢的飞石 ⋅ 40分钟前 ⋅ 0

ecs修改主机名称

https://help.aliyun.com/knowledge_detail/41305.html

张宏亮1982 ⋅ 42分钟前 ⋅ 0

扩展JS validate

if ($.validator) { //验证手机号码 $.validator.addMethod("phone", function (value, element, params) { return /^(1)[0-9]{10}$/.test(value); }, "请输入有效的......

熊猫你好 ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部