GraphQL 配合 JWT 使用 —— Laravel RSS (二)

本文字数:7025,大概需要 14.05 分钟。

我们了解了 jwtGraphQL 的使用,那接下来看看他们如何结合使用。

小试牛刀

创建 myProfile query

<?php
/**
 * User: yemeishu
 * Date: 2018/4/21
 * Time: 上午8:55
 */

namespace App\GraphQL\Query;

use App\User;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Query;
use Rebing\GraphQL\Support\SelectFields;
use Tymon\JWTAuth\Facades\JWTAuth;

class MyProfileQuery extends Query {
    private $auth;

    protected $attributes = [
        'name' => 'My Profile Query',
        'description' => 'My Profile Information'
    ];

    public function authorize(array $args) {
        try {
            $this->auth = JWTAuth::parseToken()->authenticate();
        } catch (\Exception $e) {
            $this->auth = null;
        }

        return (boolean) $this->auth;
    }

    public function type() {
        return GraphQL::type('myprofile');
    }

    public function resolve($root, $args, SelectFields $fields) {
        $user = User::with(array_keys($fields->getRelations()))
            ->where('id', $this->auth->id)
            ->select($fields->getSelect())->first();

        return $user;
    }

}

创建 Type

<?php
/**
 * User: yemeishu
 * Date: 2018/4/21
 * Time: 下午3:59
 */

namespace App\GraphQL\Type;

use App\User;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Type as GraphQLType;

class MyProfileType extends GraphQLType
{
    protected $attributes = [
        'name' => 'myprofile',
        'description' => 'A type',
        'model' => User::class, // define model for users type
    ];

    // define field of type
    public function fields()
    {
        return [
            'id' => [
                'type' => Type::nonNull(Type::int()),
                'description' => 'The id of the user'
            ],
            'email' => [
                'type' => Type::string(),
                'description' => 'The email of user'
            ],
            'name' => [
                'type' => Type::string(),
                'description' => 'The name of the user'
            ]
        ];
    }

    protected function resolveEmailField($root, $args)
    {
        return strtolower($root->email);
    }
}

注册 GraphQL config

当然要获取 jwt token,需要有一个 login 方法:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\JWTAuth;

class AuthenticateController extends Controller {
    private $jwt;

    public function __construct(JWTAuth $jwt) {
        $this->jwt = $jwt;
    }

    public function authenticate(Request $request) {
        // grab credentials from the request
        $credentials = $request->only('email', 'password');
        try {
            // attempt to verify the credentials and create a token for the user
            if (! $token = $this->jwt->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'));
    }
}

注册路由:

Route::post('/login', 'AuthenticateController@authenticate');

先利用 email 和 password 获得 token 值:

然后利用 token 获取用户信息:

获取 Xpath List

在 RSS 系统中,我们也希望给每个用户创建自己的 RSS Feeds。所以先修改 xpath 的归属。

php artisan make:migration add_user_id_to_xpaths_table --table=xpaths
public function up() {
    Schema::table('xpaths', function (Blueprint $table) {
        $table->integer('user_id')->unsigned();
    });
}

admin 添加 xpath 归属操作

XpathControllerform 函数增加 user_id 的选择框:

$form->select('user_id')->options(function ($id) {
    $user = User::find($id);
    if ($user) {
        return [$user->id => $user->name];
    }
})->ajax('/admin/users');

添加 admin/users route 和 controller

<?php

namespace App\Admin\Controllers;

use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller {

    public function users(Request $request) {
        $q = $request->get('q');
        return User::where('name', 'like', "%$q%")
            ->paginate(null, ['id', 'name as text']);
    }
}

这样就可以根据输入的 user name 来选择这个 xpath 的归属。

xpath 列表显示 user_id 值.

首先增加 一对一 关联:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Xpath extends Model
{
    public function user() {
        return $this->belongsTo(User::class);
    }
}

再在 XpathControllergrid() 直接增加 user's name:

$grid->column('user.name', '归属人');

显示效果:

利用 GraphQL 获取 Xpath 列表

1. 创建 Query

<?php
/**
 * User: yemeishu
 * Date: 2018/4/21
 * Time: 下午11:16
 */

namespace App\GraphQL\Query;

use App\Xpath;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Query;
use Rebing\GraphQL\Support\SelectFields;
use Tymon\JWTAuth\Facades\JWTAuth;

class MyXpathsQuery extends Query {
    private $auth;

    protected $attributes = [
        'name' => 'My Xpaths Query',
        'description' => 'My Xpaths Information'
    ];

    public function authorize(array $args) {
        try {
            $this->auth = JWTAuth::parseToken()->authenticate();
        } catch (\Exception $e) {
            $this->auth = null;
        }

        return (boolean) $this->auth;
    }

    public function type() {
        return Type::listOf(GraphQL::type('myxpath'));
    }

    public function resolve($root, $args, SelectFields $fields) {
        $xpaths = Xpath::with(array_keys($fields->getRelations()))
            ->where('user_id', $this->auth->id)
            ->select($fields->getSelect())
            ->get();

        return $xpaths;
    }
}

利用 jwt token 获取 user's id,然后再查询属于该用户的 xpath 列表

2. 定义返回的 Type

 <?php
/**
 * User: yemeishu
 * Date: 2018/4/21
 * Time: 下午3:59
 */

namespace App\GraphQL\Type;

use App\User;
use App\Xpath;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Type as GraphQLType;

class MyXpathType extends GraphQLType
{
    protected $attributes = [
        'name' => 'myxpath',
        'description' => 'A type',
        'model' => Xpath::class, // define model for xpath type
    ];

    // define field of type
    public function fields()
    {
        return [
            'id' => [
                'type' => Type::nonNull(Type::int()),
                'description' => 'The id of the user'
            ],
            'url' => [
                'type' => Type::string(),
                'description' => 'The url of xpath'
            ],
            'urldesc' => [
                'type' => Type::string(),
                'description' => 'The desc of the xpath'
            ]
        ];
    }
}

3. 注册 GraphQL config

4. 测试

结果自然显而易见:

总结

这是继续上一篇《花 2 小时撸一个 RSS 生成器》https://mp.weixin.qq.com/s/mRjoKgkq1PoqlVgOw8oRYw,主要是想利用 jwtGraphQL 作为接口层,为之后的前端开发,提供数据基础。

主要参考:

源代码

https://github.com/fanly/lrss

「未完待续」


原文发布于微信公众号 - coding01(coding01)

原文发表时间:2018-04-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏别先生

JSch - Java实现的SFTP(文件上传详解篇)

  JSch是Java Secure Channel的缩写。JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11...

1.3K10
来自专栏一个会写诗的程序员的博客

《Kotin 极简教程》第9章 轻量级线程:协程(2)《Kotlin极简教程》正式上架:

如果需要依次调用它们, 我们只需要使用正常的顺序调用, 因为协同中的代码 (就像在常规代码中一样) 是默认的顺序执行。下面的示例通过测量执行两个挂起函数所需的总...

14820
来自专栏圆方圆学院精选

【刘文彬】 Debug EOS:nodeos + mongo_db_plugin

原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/storage.html

16120
来自专栏栗霖积跬步之旅

java多线程编程核心技术——第一章总结 1.5sleep()方法

1.1进程、多线程的概念及线程的优点 进程的概念: 百度百科讲解: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和...

220100
来自专栏Android-JessYan

你不知道的Retrofit缓存库RxCache前言简介使用详解总结

22620
来自专栏逸鹏说道

Python3 与 C# 并发编程之~ 进程实战篇

之前说过 Queue:在 Process之间使用没问题,用到 Pool,就使用 Manager().xxx, Value和 Array,就不太一样了:

18440
来自专栏Android 开发学习

Android内存泄漏分析总结

20240
来自专栏小俊博客

ThinkPHP5框架与ThinkPHP3.2的对比区别

26830
来自专栏蓝天

细节决定品质:不良的if/else使用习惯

这个时候应当考虑提取成函数调用,以减少直接的if/else嵌套层次。同理,while/for也应当避免这种情况。

9910
来自专栏玄魂工作室

PHP代码审计Day2 - filter_var函数缺陷

--------------------------------------------------------------------------------...

14220

扫码关注云+社区

领取腾讯云代金券