将 AngularJs 控制器的令牌传递给 Laravel API

Posted

技术标签:

【中文标题】将 AngularJs 控制器的令牌传递给 Laravel API【英文标题】:Pass the token of an AngularJs controller to a Laravel API 【发布时间】:2019-03-25 04:19:54 【问题描述】:

我正在尝试传递我在我的 Java Script 控制器中拥有的令牌以向 Laravel 中的 API 进行身份验证。从我的控制器的标题中,我定义了一个“授权”:“承载”+ $ scope.token“要发送到API。但不幸的是我遇到了这个错误:

“token_not_provided”

路线:

Route::get('/members', 'PessoaController@index')->middleware('jwt.auth');

我正在使用 JWTAuth。

我的控制器 API:

use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
use App\User;
use Illuminate\Support\Facades\DB;
use App\Http\Requests\PessoaRequest;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Facades\JWTAuth;

class PessoaController extends Controller


protected $user;

    public function __construct(\Illuminate\Http\Request $request)

    $header = $request->header('Authorization');

    return response([
        'status' => 'success'
    ]) ->header('Authorization', $header);

角度控制器:

(function() 
 app.controller('MemberController', [
'$scope', '$rootScope', 'AppConfig', '$http',
function($scope, $rootScope, AppConfig, $http) 
  var vm = this;
  $rootScope.page.title = 'SEC BASE';

  $rootScope.authenticated = true;
  $scope.token = $rootScope.user.remember_token;
   getMembers();

    // Obtem a listagem de todos os usuarios
  function getMembers() 
      Loading.show();
    $http(
        headers: 
            'Content-Type' : 'application/json',
            'Authorization' : 'Bearer ' + token
        ,
        method: 'GET',
        url: AppConfig.ApiUrl + 'members'
    ).then( response => 
      // console.log(response);
      $scope.members = response.data;
    ).finally(Loading.hide)
        .catch(function(err) 
            console.log(err);
        );
  
  
  ]);
)();

Handler.php

use Exception;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Tymon\JWTAuth\Facades\JWTAuth;
public function render($request, Exception $exception)

    // detect instance
    try 
        $user = JWTAuth::parseToken()->authenticate();
     catch (Exception $e) 
        if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException)
            return $this->respondWithError("Token is Invalid");
        else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException)
            return $this->respondWithError(['error'=>'Token is Expired']);
        else
            return $this->respondWithError(['error'=>'Something is wrong']);
        
    
    return $next($request);

错误返回:

【问题讨论】:

'Bearer ' + $scope.token。请注意 Angular JS 代码中缺少的空格。 但你必须有那个空间。 你必须有那个空间。否则,它会将Authorization 值视为单个字符串。 仍然返回同样的错误 400 bad request 不是授权问题。发送到请求的参数和发出的请求类型不是所需的格式。 【参考方案1】:

如果 Bearer 不工作,那么你必须发送带有参数数据的令牌

不在标题中。我也遇到过这个问题,并通过发送带有 body 参数的令牌来解决。

尝试使用 Body 参数发送。

如果这不起作用,那么还要检查更改中间件代码

这里有 1 行需要更改

public function handle($request, Closure $next)

    try
        $user = JWTAuth::toUser($request->input('token'));
        // this will get token from body parameter

【讨论】:

toUser 类是我在身份验证中使用的用户类吗? toUser us JWTAuth 函数,您可以像我在代码中给出的那样直接使用它并在正文参数中传递令牌【参考方案2】:

您构建请求的方式看起来不错。 看起来错误来自没有收到令牌的 API 服务器。

如果您使用 Apache 运行 PHP 应用程序,那么您应该查看 this question and the accepted answer。

Apache 没有正确地将授权标头提供给应用程序。必须在您的 .htaccess 中设置专用规则才能获取它。

【讨论】:

以上是关于将 AngularJs 控制器的令牌传递给 Laravel API的主要内容,如果未能解决你的问题,请参考以下文章

将 csrf 令牌传递给 blueimp 文件上传

如何将标头动态传递给 angularjs 的 $resource

如何将数据 Codeigniter 控制器传递给 Angularjs 控制器

如何将 AngularJS 变量值传递给 C# 控制器?

如何将数据从angularjs传递给spring控制器

angularjs组件控制器未将初始绑定值传递给模板中的指令(summernote)