AngularJS 和 Laravel - CORS
AngularJS and Laravel - CORS
我有以下设置:
Angular前端的 JS 向 Laravel API 发出 $http 请求。
例如,在开始时 mainCtrl 请求 Laravel 中的会话是否存在,如果存在,他将用户登录到应用程序。
我已经用 Postman 测试了 API,它运行良好。
我正在使用Laravel 5
我发一个JSON这样的
{
"user":"user",
"password":"password"
}
和 API 检查它是否有效,如果他 returns 是一个访问令牌。
它会将令牌和用户 ID 写入 laravel 会话。
使用路由 /checkLogin 检查是否存在具有有效令牌的会话。这也适用于 Postman。
这里是 laravel 后端的 login 和 checkLogin 的两个函数:
public function login(){
$user = User::where('email', '=', Input::get('login'))->first();
if($user == null)
$user = User::where('login', '=', Input::get('login'))->first();
if($user != null){
if($user->password==sha1(Input::get('password'))){
$token = new Token;
$token->userid = $user->id;
$token->token=self::getGUID();
Session::put('user_id', $user->id);
Session::put('user_token', $token->token);
$token->save();
return $token->token;
}else
return "Wrong username or password";
}else
return "Wrong username or password";
}
public function checkLogin(){
$token =null;
if(Session::has('user_token')){
$token = Session::get('user_token');
}
if($token == null){
$token = Input::get('token');
}
if($token != null){
$test = Token::where('token', '=', $token)->where('userid', '=', Session::get('user_id'))->first();
return User::where('id', '=', $test->userid)->first();
}
return "no session";
}
我所知道的是创建一些 Angular 函数来让它真正发挥作用。
当我打开我的网站时,它应该检查用户是否已登录。它实际上会触发登录的获取功能。
example.factory('Login', function($http) {
return {
get : function() {
return $http({
method: 'GET',
url: 'http://api.example.com/checkLogin',
headers: { 'Content-Type' : 'application/json' }
});
},
save : function(loginData) {
return $http({
method: 'POST',
url: 'http://api.example.com/login',
headers: { 'Content-Type' : 'application/json' },
data: loginData
});
}
}
});
它似乎也工作正常。在我的控制台中,我看到 "no session"。如果我没有登录应该没问题。
所以我现在尝试登录。我 运行 从上面登录的保存功能。我的数据像这样放在一起:
$scope.logmein = function () {
loginData = {
'login' : $scope.login,
'password' : $scope.password
};
Login.save(loginData)
.success(function(data) {
console.log(data);
Login.get()
.success(function(getData) {
console.log(getData);
if(data==="no session"){
$scope.loggedin=false;
}
else{
$scope.loggedin=true;
}
});
})
.error(function(data) {
console.log(data);
});
}
当我点击提交时,我在我的控制台中得到了预期的令牌。现在一切都应该很好。为了更新我的站点,我再次 运行 checkLogin 函数。它现在应该把我的会话还给我,但它说没有会话。当我登录时,会话应该放在一起。
我已经尝试了很多小时来解决这个问题,但很多时候它给了我一个 CORS 错误,或者当没有出现 CORS 错误时,它只是做了我刚才解释的事情。
我希望你们有人能弄清楚为什么。
您需要在响应中设置 'Access-Control-Allow-Origin' 和 'Access-Control-Allow-Methods' headers:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
?>
编辑
在 lavarel 中可以在所有响应中设置 headers 在此要点中找到下面的代码 https://gist.github.com/eweap/1df3b1662a500857133a:
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Routing\Middleware;
use Illuminate\Http\Response;
class CORS implements Middleware {
/**
* 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', 'POST, GET, OPTIONS, PUT, DELETE')
->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With');
}
}
您需要在 Kernel.php
中设置此中间件
我有以下设置: Angular前端的 JS 向 Laravel API 发出 $http 请求。 例如,在开始时 mainCtrl 请求 Laravel 中的会话是否存在,如果存在,他将用户登录到应用程序。 我已经用 Postman 测试了 API,它运行良好。
我正在使用Laravel 5
我发一个JSON这样的
{
"user":"user",
"password":"password"
}
和 API 检查它是否有效,如果他 returns 是一个访问令牌。 它会将令牌和用户 ID 写入 laravel 会话。
使用路由 /checkLogin 检查是否存在具有有效令牌的会话。这也适用于 Postman。
这里是 laravel 后端的 login 和 checkLogin 的两个函数:
public function login(){
$user = User::where('email', '=', Input::get('login'))->first();
if($user == null)
$user = User::where('login', '=', Input::get('login'))->first();
if($user != null){
if($user->password==sha1(Input::get('password'))){
$token = new Token;
$token->userid = $user->id;
$token->token=self::getGUID();
Session::put('user_id', $user->id);
Session::put('user_token', $token->token);
$token->save();
return $token->token;
}else
return "Wrong username or password";
}else
return "Wrong username or password";
}
public function checkLogin(){
$token =null;
if(Session::has('user_token')){
$token = Session::get('user_token');
}
if($token == null){
$token = Input::get('token');
}
if($token != null){
$test = Token::where('token', '=', $token)->where('userid', '=', Session::get('user_id'))->first();
return User::where('id', '=', $test->userid)->first();
}
return "no session";
}
我所知道的是创建一些 Angular 函数来让它真正发挥作用。 当我打开我的网站时,它应该检查用户是否已登录。它实际上会触发登录的获取功能。
example.factory('Login', function($http) {
return {
get : function() {
return $http({
method: 'GET',
url: 'http://api.example.com/checkLogin',
headers: { 'Content-Type' : 'application/json' }
});
},
save : function(loginData) {
return $http({
method: 'POST',
url: 'http://api.example.com/login',
headers: { 'Content-Type' : 'application/json' },
data: loginData
});
}
}
});
它似乎也工作正常。在我的控制台中,我看到 "no session"。如果我没有登录应该没问题。 所以我现在尝试登录。我 运行 从上面登录的保存功能。我的数据像这样放在一起:
$scope.logmein = function () {
loginData = {
'login' : $scope.login,
'password' : $scope.password
};
Login.save(loginData)
.success(function(data) {
console.log(data);
Login.get()
.success(function(getData) {
console.log(getData);
if(data==="no session"){
$scope.loggedin=false;
}
else{
$scope.loggedin=true;
}
});
})
.error(function(data) {
console.log(data);
});
}
当我点击提交时,我在我的控制台中得到了预期的令牌。现在一切都应该很好。为了更新我的站点,我再次 运行 checkLogin 函数。它现在应该把我的会话还给我,但它说没有会话。当我登录时,会话应该放在一起。 我已经尝试了很多小时来解决这个问题,但很多时候它给了我一个 CORS 错误,或者当没有出现 CORS 错误时,它只是做了我刚才解释的事情。
我希望你们有人能弄清楚为什么。
您需要在响应中设置 'Access-Control-Allow-Origin' 和 'Access-Control-Allow-Methods' headers:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
?>
编辑
在 lavarel 中可以在所有响应中设置 headers 在此要点中找到下面的代码 https://gist.github.com/eweap/1df3b1662a500857133a:
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Routing\Middleware;
use Illuminate\Http\Response;
class CORS implements Middleware {
/**
* 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', 'POST, GET, OPTIONS, PUT, DELETE')
->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With');
}
}
您需要在 Kernel.php
中设置此中间件