基于令牌的身份验证http拦截器

时间:2017-06-14 16:56:41

标签: symfony angular-http-interceptors

我想要你的意见,以实现一些目标。我有一个api,我想限制用户的访问权限。但是短篇小说很长,在页面/登录的操作登录控制器中我为用户验证生成了令牌,然后我将其返回。好吧,这是我的一个问题/问题。在动作控制器中必须返回一个响应,我的令牌以json格式发送并显示在浏览器上,但我不想这样,我只是想保持响应或某些东西让我的角色部分采取那个标记并以其方式处理它。所以我的方法登录:

  public function loginAction(Request $request)
{

    $username= $this->get('security.token_storage')->getToken()->getUser()->getEmail();
    $serviceUser = $this->container->get('ubb_user_login');
    $tokenUser = $serviceUser->generateToken($username);
    $response = new JsonResponse(array('Token' => $tokenUser));

    return $response;
}
第二个问题。我不知道在哪里提取令牌的角度。在控制器中我尝试了一些东西:

app.controller('loginApi', function ($scope, $http, $window){

$http.get(
    '/api/user/login'
).then(function (success) {
    $scope.token = success.data.Token;
    $window.localStorage.setItem('Token', token); // it's okay used like this localStorage?
});
});

在这里,我只想从/ login操作获取令牌,将其保存在本地存储中,然后使用$ http请求拦截器在每个请求上显示它。那部分有效。如果我在头部auth中发送一个随机字符串,它正在工作,它让我可以访问api:

function httpInterceptor() {
return {
    request: function(config) {
        config.headers.authorization = 'jdjdnnkdkd';
        return config;
    },
    responseError: function(errorResponse) {
        switch (errorResponse.status) {
            case 403:
                window.location = '/login';
                break;
            case 401:
                window.location = '/login';
        }
        return $q.reject(errorResponse);
    }
 }
 }

所以,我遇到的问题: 1)如何发送令牌以使角度取得它,但是不能在浏览器中显示?假设我有一个访问api的菜单,如果用户没有通过身份验证,点击未经身份验证的链接,它会在登录页面上发送给我,在我成功验证后,将我重定向到菜单上? 2)返回令牌后,究竟要在角度中使用它?在哪个控制器?以及如何保存它?

非常感谢,谢谢。

1 个答案:

答案 0 :(得分:1)

您似乎需要一个单独的api资源来处理令牌。您是否尝试过使用FOSOAuthServeBundle?它对设置oauth身份验证,令牌等有很大帮助。

通常,您需要单独调用令牌,即:

  • angluar app向get token资源发出请求,返回令牌并临时存储在角度应用中
  • 为每个后续请求使用该令牌 - 检查oauth bundle配置文件,了解如何设置哪些URL必须受到oauth保护,但该捆绑包将为您处理此问题

关于角度问题,请查看此q / a How to store authentication bearer token in browser cookie using AngularJS