【问题标题】:Laravel - Passport API integration | Error: {"message":"Unauthenticated."}Laravel - Passport API 集成错误:{“消息”:“未验证。”}
【发布时间】:2018-11-08 21:39:53
【问题描述】:

我是Laravel 的新手。我刚刚开始使用this reference link 学习Laravel 护照集成。

下面是我的路由文件api.php

Route::post('login', 'API\PassportController@login'); // this is working fine
Route::post('register', 'API\PassportController@register'); // this is working fine
Route::group(['middleware' => 'auth:api'], function(){
   Route::post('get-details' , 'API\PassportController@getDetails'); // This is giving me error
});

PassportController.php >> getDetails()功能码,

/**
 * details api
 *
 * @return \Illuminate\Http\Response
 */
public function getDetails()
{
    $user = Auth::user();
    return response()->json(['success' => $user], $this->successStatus);
}

config/auth.php

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

我已经更新了in the article提到的其余文件。

注册和登录 API 工作正常,但是当我尝试运行 /get-details api 时,我收到了 {"message":"Unauthenticated."} 的响应。

在标题中,我传递如下值,

奇怪的是,相同的代码在我的本地主机服务器 (OS-Windows) 上运行良好,但是当我在托管服务器 (OS-ubuntu) 上运行此 API 时,它就不起作用了。

谁能帮我解决这个问题?这与服务器配置设置有关吗?我什至无法调试这段代码来检查我在哪里做错了。

提前致谢!!

【问题讨论】:

  • 尝试在标题 'Content-Type' -- 'application/x-www-form-urlencoded' 中再添加一个 Key 可能会有运气

标签: php laravel-5 laravel-passport


【解决方案1】:

您是否在标头中传递了 api 令牌。 如果没有,首先您必须将登录详细信息传递给 api 并获取 api 令牌。然后将此令牌传递给您尝试访问的请求。 另一种可能性是你需要运行 如果您的环境从本地更改为实时,请再次使用 Passport 安装命令

【讨论】:

  • 是的,我确实做到了。我首先登录并获取访问令牌,然后通过标头将其传递给 /get-details api。我正在传递标头值,例如 Accept: application/jsonAuthorization: Bearer 。我也直接在服务器上运行命令来安装新的 Laravel 和护照。你认为我应该再次运行该命令,因为我没有上传代码吗?谢谢!!
  • @Jchauhan 你解决过这个问题吗?哪种解决方案适合您?
【解决方案2】:

你添加 Passport::routes();在 AuthServiceProvider 中

<?php

 namespace App\Providers;

 use Laravel\Passport\Passport;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Foundation\Support\Providers\AuthServiceProvider as 
 ServiceProvider;

 class AuthServiceProvider extends ServiceProvider
 {
/**
 * The policy mappings for the application.
 *
 * @var array
 */
protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
];

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
  public function boot()
  {
    $this->registerPolicies();
    Passport::routes();
    Passport::tokensExpireIn(now()->addDays(15));
    //Passport::refreshTokensExpireIn(now()->addDays(30));
    //
   }
}

请参考此链接 https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876

【讨论】:

  • 是的,我做到了。我按照链接laravelcode.com/post/… 中提到的所有步骤进行操作。如果我错过了本文未提及的内容,请检查并告诉我。此外,我对代码进行了一些调试,发现除了“Authorization:Bearer ACCESS_TOKEN”参数之外,我得到了所有的标头参数。这就是它无法获取令牌的原因。你能帮我看看为什么会这样吗??
  • 编辑您的 .htaccess 文件 RewriteEngine On RewriteCond %{HTTP:Authorization} 。 RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
  • 它已经按照您的代码。这是我当前的代码, RewriteEngine On RewriteCond %{HTTP:Authorization} 。 RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 我还需要在 .htacess 文件中更新什么吗?
  • Amit - 每次在请求中都忽略“授权”标头参数。这就是为什么不发送令牌的原因。你能告诉我这样的行为可能是什么原因吗??
【解决方案3】:

在控制器中添加下一行,

public function __construct()
    {
        $this->middleware('auth:api');
    }

另外,请尝试以下命令,

php artisan optimize:clear

【讨论】:

    【解决方案4】:

    auth:api 中间件期望请求通过 JSON 进入。

    它在传入的请求标头中寻找 X-Requested-With : XMLHttpRequest。找不到的时候就掉入app/Exceptions/Handler中的unauthenticated方法,返回错误。

    如果您将 X-Requested-With : XMLHttpRequest 添加到您的请求标头,它应该可以解决问题。

    【讨论】:

    • 它也没有用。我自己调试了代码,发现除了“Authorization: Bearer ACCESS_TOKEN”参数之外,我得到了所有的 header 参数。这就是它无法获取令牌的原因。你能帮我为什么会这样吗?如何在标头中传递授权参数?我还检查了我的 .htaccess 文件,我猜它很好。
    【解决方案5】:

    编辑您的 .htaccess 文件,可能存在一些配置问题。

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    

    【讨论】:

      【解决方案6】:

      尝试安装包 laravel-cors 并在包提供的 allowedHeaders 选项中添加 Authorization 标头。

      'allowedHeaders' => ['Authorization']
      

      也许可以解决标头不发送的问题。

      或者您可能需要更改apache 设置

      【讨论】:

      • 您能否详细说明这一点?实际上我必须在 apache 设置中进行哪些更改?
      • 您需要将此行添加到 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 到您的 apache 配置文件中。此外,您还需要在更改配置文件后重新启动 apache
      猜你喜欢
      • 1970-01-01
      • 2017-01-06
      • 2018-11-05
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 2017-09-01
      相关资源
      最近更新 更多