Codeigniter 为什么';t登录会话“;棍子;使用“登录时”;“爱奥尼亚服务”;窗口,但当我将浏览器指向www文件夹时会工作?

Codeigniter 为什么';t登录会话“;棍子;使用“登录时”;“爱奥尼亚服务”;窗口,但当我将浏览器指向www文件夹时会工作?,codeigniter,cordova,ionic,ion-auth,codeigniter-restserver,Codeigniter,Cordova,Ionic,Ion Auth,Codeigniter Restserver,我正在使用Ionic在Codeigniter/Ion_Auth/Codeigniter restclient上构建一个登录系统,当我尝试从“Ionic server”登录时,登录正常,但对logged_in()方法的下一个api请求返回false 当我将浏览器指向www文件夹时,同样的事情也能正常工作 因此,问题是一步一步地解决的: 发球 您将看到登录表单() 输入电子邮件并通过 RESTAPI返回“登录成功” $state.go('app.profile')工作并重定向到 REST get a

我正在使用Ionic在Codeigniter/Ion_Auth/Codeigniter restclient上构建一个登录系统,当我尝试从“Ionic server”登录时,登录正常,但对logged_in()方法的下一个api请求返回false

当我将浏览器指向www文件夹时,同样的事情也能正常工作

因此,问题是一步一步地解决的:

  • 发球

  • 您将看到登录表单()

  • 输入电子邮件并通过

  • RESTAPI返回“登录成功”

  • $state.go('app.profile')工作并重定向到

  • REST get api/logged_in返回false,我重定向到登录页面

  • 如果我在普通浏览器中执行相同操作,步骤1将变为:打开浏览器并转到,在步骤6,REST get api/logged_in返回true,并且我没有重定向到登录页面,我将停留在配置文件页面

    代码是一样的。所以我猜可能是ion_auth没有得到它想要的cookies或者会话被重置了。在这一点上,我不确定问题出在哪里。这是我的第一个Ionic/App项目,因此我可能缺少一些关于使用浏览器中的代码从移动应用程序进行身份验证的正确方法

    多谢各位

    更新:
    似乎在使用“离子服务器”窗口时,对API的每个请求都会触发一个新会话。新的会话存储在数据库中,ion_auth根据最后一个会话测试登录的会话,该会话不包含登录详细信息。

    您正在学习REST api、cookie和会话。饼干和会议不符合休息哲学

    让我告诉你我们是如何在项目中解决这个问题的。通过“Authorization”(授权)标头值可以知道哪个用户正在请求以及它是否具有访问权限。您可以使用基本身份验证,Barer或任何其他

    我们通常更喜欢基于令牌的授权系统。登录成功后,服务器将发送一个令牌。在ionic应用程序中,我们使用名为
    SessionService
    工厂保存它。所以,每当用户登录时,就会存储令牌并用于每个请求。但如果用户关闭应用程序,令牌将丢失。所以我们可以把它存储在本地存储器中。然后,用户可以直接重定向到仪表板,直到用户注销

    app.factory("SessionService", function($window){
        var user={};
    
        if ($window.localStorage['user']!=undefined){
            user=JSON.parse($window.localStorage['user']);
            console.log(user);
        }
    
        return{
            isLoggedIn:function(){
                return !isEmpty(user);
            },
            logout:function(){
                console.log("logout")
                user={};
                $window.localStorage.clear();
            },
            setUser:function(data){
                user=data;
                $window.localStorage['user']= JSON.stringify(user);
            }, 
            getUser:function(){
                return user;
            }
        }
    })
    
    现在,在每个web请求中,当设置值
    Authorization
    头时,可以调用
    SessionService.getUser().token

    更新:

    尽管不建议使用cookies,但您可以轻松地在应用程序中使用它

    如果您使用CORS发送请求,angular不会随请求发送Cookie。 解决此问题的方法之一是在每个请求中发送
    with credentials:true

    $http({withCredentials: true, ...}).get(...)
    
    进一步了解这一点


    希望这有帮助

    你清楚这个问题吗?对我来说不是。我试过好几次去理解它,但事实上,这是模糊的。请澄清你有什么,你测试了什么,你的问题是什么。我添加了一个逐步的解释,希望它有助于规划更好地像那样。你如何配置你的
    cookie\u域
    cookie\u路径
    我使用ion\u auth库为codeigniter。ion_auth使用codeigniter会话库发送浏览器应发回的cookie。这些cookie从未发送,因此使用cookie的身份验证只工作一次。第二个请求api获取一些数据会触发一个新会话,因为cookie没有被发送。会话存储在db中,当使用常规浏览器时,登录后对api的调用不会触发新会话虽然我同意Cookie不是使用api的最佳方式(此时我可能会尝试本地存储解决方案),但这并不意味着它们作为功能被删除。还是他们?据我所知,即使不推荐使用cookies,cookies也应该有效。