我对Laravel 5.x中的身份验证有疑问。我一直在专门查看tymondesigns/jwt-auth
和irazasyed/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
感谢。
更新
使用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);
?>
如何获取自定义令牌?
答案 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',
在任何地方使用env()
功能都不是好习惯。最好在配置文件中使用它,然后在其他地方使用config()
功能。
您可能还需要重新实现用户提供商。
答案 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);
有关更多详细信息,请参见下面的链接