【问题标题】:Laravel 5.1 dont receive JWT token from Dingo APILaravel 5.1 不接收来自 Dingo API 的 JWT 令牌
【发布时间】:2018-08-12 13:18:56
【问题描述】:

我使用 Laravel 5.1 + Dingo API + JWT 令牌。我的路线是:

$api = app('Dingo\Api\Routing\Router');

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

$api->post('authenticate', 'App\Http\Controllers\AuthenticateController@authenticate');
$api->post('logout', 'App\Http\Controllers\AuthenticateController@logout');
$api->get('token', 'App\Http\Controllers\AuthenticateController@getToken');
$api->get('test', 'App\Http\Controllers\BitemsController@test');

});

$api->version('v1', ['middleware' => 'api.auth'], function ($api) {

    $api->get('authenticated_user', 'App\Http\Controllers\AuthenticateController@authenticatedUser');
    $api->get('getvoucher', 'App\Http\Controllers\BitemsController@index');
    $api->post('/store', 'App\Http\Controllers\BitemsController@store');
    $api->put('/update/{key}', 'App\Http\Controllers\BitemsController@update');

});

现在当我在 Postman 跑去获取令牌时,一切都很好,所以我得到:

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjExMDIsImlzcyI6Imh0dHBzOi8vYXBwLmRpbmVhbmRnaWZ0LmNvbS9hcGkvYXV0aGVudGljYXRlIiwiaWF0IjoxNTIwMjAxMzYwLCJleHAiOjE1MjAyMDQ5NjAsIm5iZiI6MTUyMDIwMTM2MCwianRpIjoiNlhTZWdPRllpaGZNWk5sSSJ9.f71ReEY_3I2-uj-7PJNBxbHhO8C50XP5kbShrnmZ8Ig"
}

但现在我想检索身份验证用户,并且我的功能受中间件保护,但我得到:

{
    "message": "Failed to authenticate because of bad credentials or an invalid authorization header.",
    "status_code": 401,
    "debug": {
        "line": 113,
        "file": "/home/dgadmin/public_html/test/vendor/dingo/api/src/Auth/Auth.php",
        "class": "Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException", ... ETC...

这里有什么问题以及如何解决这个问题?

当我打电话时很有趣:

https://app.example.com/api/authenticated_user?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjExMDIsImlzcyI6Imh0dHBzOi8vYXBwLmRpbmVhbmRnaWZ0LmNvbS9hcGkvYXV0aGVudGljYXRlIiwiaWF0IjoxNTIwMjAxMzYwLCJleHAiOjE1MjAyMDQ5NjAsIm5iZiI6MTUyMDIwMTM2MCwianRpIjoiNlhTZWdPRllpaGZNWk5sSSJ9.f71ReEY_3I2-uj-7PJNBxbHhO8C50XP5kbShrnmZ8Ig

那么一切都很好...但是当我将令牌作为Authorization 标头和Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjExMDIsImlzcyI6Imh0dHBzOi8vYXBwLmRpbmVhbmRnaWZ0LmNvbS9hcGkvYXV0aGVudGljYXRlIiwiaWF0IjoxNTIwMjAxMzYwLCJleHAiOjE1MjAyMDQ5NjAsIm5iZiI6MTUyMDIwMTM2MCwianRpIjoiNlhTZWdPRllpaGZNWk5sSSJ9.f71ReEY_3I2-uj-7PJNBxbHhO8C50XP5kbShrnmZ8Ig 发送时,我从上面收到了401 错误...

为什么 Laravel 不接受带有我的令牌的授权标头?

我尝试添加 .htaccess 文件:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On



    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteRule ^ - [E=HTTPS_AUTHORIZATION:%{HTTPS:Authorization}]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]




</IfModule>

如您所见,我添加了RewriteRule ^ - [E=HTTPS_AUTHORIZATION:%{HTTPS:Authorization}] 但什么也没发生

如何解决?

【问题讨论】:

  • 你能在你的 Authenticate 控制器中也显示 authenticatedUser 方法吗?

标签: laravel apache laravel-5.1 php-7 dingo-api


【解决方案1】:

你应该有一个像这样的AuthController

use Dingo\Api\Routing\Helpers;

class AuthController extends Controller
{
    use Helpers;

/**
     * Get the authenticated User.
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth()->user());
    }
}

在您的路线中 - api.php,你可以有这样的路线:

$api->version('v1', ['middleware' => 'api.auth'], function ($api) {
    $api->post('auth/me', 'App\Http\Controllers\AuthController@me');
});

这将返回经过身份验证的用户对象。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 2017-05-11
    • 2017-11-13
    • 2017-06-10
    • 2016-01-30
    • 2015-03-22
    • 1970-01-01
    • 2020-05-14
    • 2015-11-07
    相关资源
    最近更新 更多