基于令牌的身份验证 http 拦截器
Token based authentication http interceptor
我想听听您的意见,以便有所作为。我有一个 api,我想限制用户的访问。但长话短说,在页面 /login 的操作登录控制器中,我为经过身份验证的用户生成了令牌,并且我 return 它。好吧,我的 question/problem 来了。在动作控制器中必须 return 响应,我的令牌以 json 格式发送并显示在浏览器上,但我不想要这个,我只想保持响应或在一些东西,以便我的 angular 部分接受该令牌并以其方式处理它。所以我的方法登录:
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;
}
第二题。我不知道在 angular 中提取令牌的位置。在控制器中我尝试了一些东西:
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 请求拦截器在每个请求上显示它。那部分有效。如果我在 header 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) 如何发送令牌以便 angular 接受它,但不在浏览器中显示?假设我有一个访问 api 的菜单,如果用户未通过身份验证,单击 link 未经身份验证,它会在登录页面上发送给我,在我成功验证后,重定向我在菜单上?
2) 在 returning 令牌后,在 angular 中究竟在哪里使用它?在哪个控制器?以及如何保存?
非常感谢,谢谢。
您似乎需要一个单独的 api 资源来处理令牌。您是否尝试过使用 FOSOAuthServeBundle?它对设置 oauth 身份验证、令牌等有很大帮助。
一般来说,您需要单独调用令牌,即:
- angluar 应用程序向
get token
资源发出请求,返回令牌并临时存储在 angular 应用程序中
- 为每个后续请求使用该令牌 - 检查 oauth 包配置,了解如何设置哪些 url 必须受到 oauth 保护,但该包会为您处理这个
关于您的 angular 问题,请查看此 q/a
我想听听您的意见,以便有所作为。我有一个 api,我想限制用户的访问。但长话短说,在页面 /login 的操作登录控制器中,我为经过身份验证的用户生成了令牌,并且我 return 它。好吧,我的 question/problem 来了。在动作控制器中必须 return 响应,我的令牌以 json 格式发送并显示在浏览器上,但我不想要这个,我只想保持响应或在一些东西,以便我的 angular 部分接受该令牌并以其方式处理它。所以我的方法登录:
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;
}
第二题。我不知道在 angular 中提取令牌的位置。在控制器中我尝试了一些东西:
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 请求拦截器在每个请求上显示它。那部分有效。如果我在 header 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) 如何发送令牌以便 angular 接受它,但不在浏览器中显示?假设我有一个访问 api 的菜单,如果用户未通过身份验证,单击 link 未经身份验证,它会在登录页面上发送给我,在我成功验证后,重定向我在菜单上? 2) 在 returning 令牌后,在 angular 中究竟在哪里使用它?在哪个控制器?以及如何保存?
非常感谢,谢谢。
您似乎需要一个单独的 api 资源来处理令牌。您是否尝试过使用 FOSOAuthServeBundle?它对设置 oauth 身份验证、令牌等有很大帮助。
一般来说,您需要单独调用令牌,即:
- angluar 应用程序向
get token
资源发出请求,返回令牌并临时存储在 angular 应用程序中 - 为每个后续请求使用该令牌 - 检查 oauth 包配置,了解如何设置哪些 url 必须受到 oauth 保护,但该包会为您处理这个
关于您的 angular 问题,请查看此 q/a