DingoAPI和JWT

安装 在 composer.json中写入以下代码,然后执行composer update

"require-dev": {
        "dingo/api" : "1.0.*@dev",
        "tymon/jwt-auth": "0.5.*"
    },

配置---在config/app.php中

'providers' => [
    Dingo\Api\Provider\LaravelServiceProvider::class,
    Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
],
'aliases' => [
    'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
    'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,
],

然后执行

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
//  这个可能是生成token的
php artisan jwt:generate
图片.png

配置

// 在 .env 文件里
API_STANDARDS_TREE=vnd
API_PREFIX=api
API_VERSION=v1

// config/api.php里大概171行的 auth 数组里添加以下配置
'auth' => [
        'basic'=> function($app){
            return new \Dingo\Api\Auth\Provider\Basic($app['auth']);
        },
        'jwt' => function($app){
            return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']);
        }
    ],

//  config/jwt.php里面  文件使用默认的即可 
// 大概第15行的key 是执行 php artisan jwt:generate 的时候自动生成的
'secret' => env('JWT_SECRET', 'a6UeS6HkENOsvmvfSM8ElIiArYjcYIJO'),



//  app/Http/Kernel.php里,大概第51行 路由中间件里追加
 protected $routeMiddleware = [
        'jwt.auth'    => \Tymon\JWTauth\Middleware\GetUserFromToken::class,
        'jwt.refresh' =>\Tymon\JWTauth\Middleware\RefreshToken::class,
    ];

使用

  • 在路由中添加以下路由
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function ($api) {
    $api->group(['namespace'=>'App\Api\Controllers'],function ($api){
        $api->get('lessions','LessionController@index');
    });
});


// 在控制器中放入测试数据
public function index()
    {
        return User::all();
    }
` php artisan api:routes`查看生成的路由

如果找不到路由,可以执行composer dump-authload.我做测试的时候发现整个项目走不通了,但是我运行了php artisan api:routes又可以了

访问路由是`域名+api/lessions`

配置好之后,我们可以参考jwt-auth的Creating Tokens手册

  • 做一个AuthController验证类
<?php
/**
 * Created by PhpStorm.
 * User: luanjinlong
 * Date: 2017/7/2
 * Time: 下午10:35
 */

namespace App\Api\Controllers;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Http\Request;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;
use Tymon\JWTauth\Middleware\GetUserFromToken;

class AuthController extends Controller
{
    public function authenticate(Request $request)
    {
        // grab credentials from the request
        $credentials = $request->only('email', 'password');
//        $credentials = [
//            'user_email' => $request->get('user_email'),
//            'user_password' => $request->get('user_password')
//        ];
        try {
            // attempt to verify the credentials and create a token for the user
            if (! $token = JWTAuth::attempt($credentials)) {
                return response()->json(['error' => 'invalid_credentials'], 401);
            }
        } catch (JWTException $e) {
            // something went wrong whilst attempting to encode the token
            return response()->json(['error' => 'could_not_create_token'], 500);
        }

        // all good so return the token
        return response()->json(compact('token'));
    }

    public function register(Request $request)
    {
        $newUser = [
            'email' => $request->get('email'),
            'name' => $request->get('name'),
            'password' => bcrypt($request->get('password')),
        ];
        $user = User::create($newUser);
//        return $user;
        $token = JWTAuth::fromUser($user);
        return response()->json(compact('token'));
    }

    public function getAuthenticatedUser()
    {
        try {

            if (! $user = JWTAuth::parseToken()->authenticate()) {
                return response()->json(['user_not_found'], 404);
            }

        } catch (TokenExpiredException $e) {

            return response()->json(['token_expired'], $e->getStatusCode());

        } catch (TokenInvalidException $e) {

            return response()->json(['token_invalid'], $e->getStatusCode());

        } catch (JWTException $e) {

            return response()->json(['token_absent'], $e->getStatusCode());

        }

        // the token is valid and we have found the user via the sub claim
        return response()->json(compact('user'));
    }

}

注意,我们在登录的时候,如果自己的用户名密码跟默认laravel的字段不匹配,我们也可以在authenticate()函数中重写credentials变量

$credentials = [
            'user_email' => $request->get('user_email'),
            'user_password' => $request->get('user_password')
        ];

我们还得在User类中重写getAuthPassword函数,这个函数是模型自带的
  {
        return $this->user_password; //此处的user_password是指的我们数据表字段。这样写即可  数据表字段是什么,此处就写什么
    }

添加一个方法$api->post('/user/login','AuthController@authenticate');,使用postman做测试

图片.png

这个时候我们可以带token去请求。但是我此处此时并没有成功,可能是我本地的原因吧

http://laravelapi/api/lessions?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjcsImlzcyI6Imh0dHA6Ly9sYXJhdmVsYXBpL2FwaS91c2VyL3JlZ2lzdGVyIiwiaWF0IjoxNDk5MDA5MDU3LCJleHAiOjE0OTkwMTI2NTcsIm5iZiI6MTQ5OTAwOTA1NywianRpIjoiZTd5b0ZmNFJFVUF3NUV4YiJ9.qMjd4QpVHWKsMgdLyhaKtzGhqVaGEbjWKJ-Zoorj954
  • 路由
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function ($api) {
    $api->group(['namespace'=>'App\Api\Controllers'],function ($api){
        $api->post('/user/login','AuthController@authenticate');
        $api->post('/user/register','AuthController@register');
        //  此处中间件可以使用 jwt.auth,也可以使用 jwt.refresh
        $api->group(['middleware'=>'jwt.auth'],function ($api){
            $api->get('lessions','LessionController@index');
        });
    });
});

如果我们想通过token去查找用户的信息,可以去访问控制器里面的getAuthenticatedUser方法

//  路由
$api->get('user/me','AuthController@getAuthenticatedUser');
访问`getAuthenticatedUser`方法

  • 推荐文章

第一篇 https://segmentfault.com/a/1190000004598315
第二篇 https://segmentfault.com/a/1190000004614022
第三篇 https://segmentfault.com/a/1190000004658193

app后端怎么设计用户登录方案


以上信息根绝博客信息测试的,下面的是我自己的测试数据

路由里面
// 访问这个路由会生成一个token
Route::get('/createUserToken','AuthenticateController@createUserToken');

请求 http://laravelapi/createUserToken
控制器里面
public function createUserToken()
    {
        $user = User::find(3);
        $token = JWTAuth::fromUser($user);
        return $token;
    }


Route::get('/getAuthenticatedUser','getAuthenticatedUser@getAuthenticatedUser');
访问  http://laravelapi/getAuthenticatedUser?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjMsImlzcyI6Imh0dHA6Ly9sYXJhdmVsYXBpL2NyZWF0ZVVzZXJUb2tlbiIsImlhdCI6MTQ5OTUxNDc5MSwiZXhwIjoxNDk5NTE4MzkxLCJuYmYiOjE0OTk1MTQ3OTEsImp0aSI6IldBNUlmdmlEbnp5SkJMTkcifQ.v_yeMa9_hRdz5OKZHWJy6cLPcgOi-Tcf5PZR1n1eEto
<?php
/**
 * Created by PhpStorm.
 * User: luanjinlong
 * Date: 2017/7/8
 * Time: 下午7:42
 */

namespace App\Http\Controllers;
use JWTAuth;

class getAuthenticatedUser
{

    // somewhere in your controller
    public function getAuthenticatedUser()
    {
        try {

            if (! $user = JWTAuth::parseToken()->authenticate()) {
                return response()->json(['user_not_found'], 404);
            }

        } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {

            return response()->json(['token_expired'], $e->getStatusCode());

        } catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {

            return response()->json(['token_invalid'], $e->getStatusCode());

        } catch (Tymon\JWTAuth\Exceptions\JWTException $e) {

            return response()->json(['token_absent'], $e->getStatusCode());

        }

        // the token is valid and we have found the user via the sub claim
        return response()->json(compact('user'));
    }


}



或者我们也可以直接简写
public function getToken()
    {
        $user = JWTAuth::parseToken()->authenticate() ;
        return $user;
    }
  • 这个时候我们会得到id=3用户的数据
图片.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容