没有数据库的Laravel中的JWT身份验证

时间:2016-06-08 13:43:32

标签: php laravel laravel-5.2 jwt guzzle

我对Laravel 5.x中的身份验证有疑问。我一直在专门查看tymondesigns/jwt-authirazasyed/jwt-auth-guard个包,以便在我的Laravel应用程序中执行JSON Web令牌身份验证和令牌处理。

我没有使用本地数据库,也不想使用本地数据库。我在.env中为我的API设置了环境变量URL, USERNAME & PASSWORD. Guzzle PHP HTTP客户端正在根据需要在API和我的应用程序之间进行良好的连接和返回数据。

但是,我需要在Laravel实例中设置身份验证。这是我遇到问题的地方,而auth想要一个数据库连接......

$token = JWTAuth::attempt($credentials)

以下是例外:

PDOException in Connector.php line 55: 
SQLSTATE[HY000] [14] unable to open database file
  1. 如何在不使用数据库的情况下使用JWT?
  2. 如何在Laravel中完全关闭数据库连接?
  3. 感谢。

    更新

    使用tymon/jwt-auth,我在路由,内核,中间件等中进行了设置。

    我成功创建了“声明”,但我需要通过编码“有效负载”来创建令牌。

    <?php
        $this->username = $request->username;
    
        $sub = $this->username;
        $iat = time();
        $jti = md5($sub . $iat);
        $aud = env('APP_URL');
    
        $this->claims = [
            'sub' => $sub,
            'iat' => $iat,
            'exp' => time() + (2 * 7 * 24 * 60 * 60),
            'nbf' => $iat,
            'iss' => 'khill',
            'jti' => $jti,
            'aud' => $aud,
        ];
    
        $payload = JWTFactory::make($this->claims);
    ?>
    

    如何获取自定义令牌?

4 个答案:

答案 0 :(得分:2)

您应该定义自定义身份验证提供程序并在 config / jwt.php 中设置它。

提供者的例子

将此课程放在您喜欢的任何地方。

namespace MyNamespace;

use Tymon\JWTAuth\Providers\Auth\AuthInterface;

class MyCustomAuthenticationProvider implements AuthInterface
{
    public function byCredentials(array $credentials = [])
    {
        return $credentials['username'] == env('USERNAME') && $credentials['password'] == env('PASSWORD');
    }

    public function byId($id)
    {
        // maybe throw an expection?
    }

    public function user()
    {
        // you will have to implement this maybe.
    }
}

配置示例

config / jwt.php providers数组中,更改此内容:

'auth' => 'Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter',

到此:

'auth' => 'MyNamespace\MyCustomAuthenticationProvider',

其他考虑因素

  1. 在任何地方使用env()功能都不是好习惯。最好在配置文件中使用它,然后在其他地方使用config()功能。

  2. 您可能还需要重新实现用户提供商

答案 1 :(得分:1)

JWTAuth :: attempt()不会帮助你解决这个问题,因为它会在幕后为你提供数据库。您需要一些其他方法来检查环境凭据。

将某个自定义方法添加到某个类的某个类中,该类将为您执行此操作,或者根据您使用Guzzle执行的API传递凭据。

代码示例:

public function authenticate($username, $password)
{
    if(!$username === env('USERNAME') or !$password === env('PASSWORD')) {
       // return a message that the user could not be authenticated or false.
    }


    // Generate the JWT token here and store it somewhere. 
}

答案 2 :(得分:0)

作为快速解决方案,我决定实施以下自定义代码......

1)创建自定义中间件来处理逻辑。

class CustomMiddleware
{
    protected $loginPath = 'login';

    public function handle($request, Closure $next) {
        $logged_in = $request->session()->get('logged_in');

        if (!$logged_in) {
            return redirect()->guest('login')->with('flag','1');
        }

    return $next($request);
    }
}

2)添加了对中间件类的引用。

class Kernel extends HttpKernel
{
    protected $routeMiddleware = [
        'custom' => \App\Http\Middleware\CustomMiddleware::class,
    ];
}

3)将其添加到routes.php。

Route::group(['middleware' => ['custom']], function () {
    // Add routes here
}

答案 3 :(得分:0)

是的。 您可以使用tymondesigns / jwt-auth软件包在没有数据库的情况下创建jwt令牌...

为此,您必须使用jwt :: encode方法...

让我解释一下...

首先,您必须将凭据放入.env文件中... 那么我建议您使用自定义声明...

之后,您可以使用以下代码创建jwt令牌...

$customClaims = ['foo' => 'bar', 'baz' => 'bob'];
$factory = JWTFactory::customClaims($customClaims);
$token = JWTAuth::encode($payload);

有关更多详细信息,请参见下面的链接

wiki