【问题标题】:Laravel API return 401Laravel API 返回 401
【发布时间】:2019-11-05 20:52:07
【问题描述】:

我正在开发移动应用程序,现在每次我尝试执行需要用户身份验证的操作时,我都会通过 API 将我的应用程序连接到服务器,我收到 401 错误,而与 postman 相同的操作可以毫无问题地完成工作。

我做了什么

  1. 将令牌存储到设备本地存储中
  2. 检索到该令牌并将其作为请求标头发送到服务器
  3. 额外添加'Accept': 'application/json, text/plain',到标头请求
  4. 添加了 this package 以打开我的后端 CROS 源。

代码

app

logout() {
    const headers = new HttpHeaders({
      'Accept': 'application/json, text/plain',
      'Authorization': this.token["token_type"] + " " + this.token["access_token"]
    });
    return this.http.post(this.env.BASE_URL + '/logout', { headers: headers })
      .pipe(
        tap(data => {
          this.storage.remove("token");
          this.isLoggedIn = false;
          delete this.token;
          return data;
        })
      )
}

route (back-end)

Route::group(['middleware' => 'auth:api'], function(){
  Route::post('logout', 'Api\AuthController@logout');
});

controller (back-end)

public function logout(Request $request)
{
  $request->user()->token()->revoke();
  return response()->json([
    'message' => 'Successfully logged out'
  ]);
}

对于这个示例,我分享了我的注销方法以及其他方法,例如 update、delete、store 是同一个结构。

结果

有什么想法吗?

【问题讨论】:

  • 我在您的请求标头中看不到授权标头。在随附的屏幕截图中。
  • @skdroid 但我的代码中有它'/logout', { headers: headers } 你认为哪里出了问题?
  • 代码是否正确可能是它的授权标头问题,您是否添加了Bearer 与B 大写?
  • 您正在使用没有正文的发布请求。试试return this.http.post(this.env.BASE_URL + '/logout', null, { headers: headers })。我宁愿为此目的使用获取请求。
  • @mafortis 您找到解决问题的方法了吗?

标签: angular laravel ionic-framework


【解决方案1】:

已解决

在我的情况下,我发现令牌来自服务器并存储到本地存储的方式的问题,因为我的令牌是这样的:

{success{token:xfdhgkhkhewrh}}

我必须得到类似的令牌

'Authorization': 'Bearer' + " " + this.token.success.token

来自本地存储。 TOKEN UNDEFINED 是返回401 的问题。

【讨论】:

    【解决方案2】:

    我几天来使用POST 方法遇到了类似的问题,最终切换到简单的GET 方法方法。下面是我的工作代码,直到提供POST 方法方法的解决方案。

    Laravel 5.5 代码:

    创建 Cors 中间件,然后在下面粘贴代码;

    app\Http\Middleware\Cors.php

    namespace App\Http\Middleware;
    
    use Closure;
    
    class Cors
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            return $next($request)
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS')
            ->header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With, X-XSRF-TOKEN');
        }
    }
    

    将 CORS 中间件注册到全局 HTTP 中间件堆栈app/Http/Kernal.php

    protected $middleware = [
            \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
            \App\Http\Middleware\Cors::class,
        ];
    

    路由\api.php

    Route::group([
      'middleware' => 'auth:api'
    ], function() {    
        Route::get('logout', 'YourController@logout');
    });
    

    你的控制器@注销

    public function logout(){
    
            auth('api')->user()->tokens->each(function ($token, $key) {
                $token->delete();
            });
    
            return response()->json(['message' => 'Successfully logged out']);
        }
    

    这是我正在使用的 Ionic 5 中的方法。

    logout() {
    
        const headers = new HttpHeaders({
          'Authorization': this.token["token_type"]+" "+this.token["access_token"]
        });
    
        return this.http.get(this.env.API_URL + 'logout', { headers: headers })
        .pipe(
          tap(data => {
            this.storage.remove("token");
            this.isLoggedIn = false;
            delete this.token;
            return data;
          })
        );
      }
    

    希望,这会有所帮助!

    【讨论】:

    • 感谢您在我的情况下分享您的解决方案987654331@ 来自本地存储。 TOKEN UNDEFINED 是返回 401 错误而不是 post 请求的问题。
    • 在为我获取双重检查后,但令牌部分正如我在评论中所说的那样,(我现在正在使用获取。)
    • 就我而言,如果我从提供的工作 GET 方法切换到 POST 方法,它会给我一个未经授权的响应。我不确定我在哪里弄错了。我的令牌匹配和邮递员测试工作正常。所以我现在坚持使用 Get 方法。
    • 只要可以从服务器获取数据,使用get方法就可以了,但是如果从服务器获取数据有问题,那么你可能会考虑检查你的令牌请求。
    • 是的,我想我只是过度尝试让 POST 方法为我工作.. 哈哈。是的,没错,就是get方法。
    猜你喜欢
    • 2019-06-28
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2017-04-04
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多