登录使用"离子服务"窗口时,为什么登录会话"不粘",但是当我将浏览器指向www文件夹时有效?

orb*_*ory 11 codeigniter cordova ion-auth codeigniter-restserver ionic

我正在使用Ionic在Codeigniter/Ion_Auth/codeigniter-restclient之上构建一个登录系统,当我尝试从"离子服务器"登录时,登录工作,但对logged_in()方法的下一个api请求返回false.

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

所以这是一步一步的问题:

  1. 运行离子服务

  2. 你看到登录表单(http:// localhost:8100 /#/ app/login)

  3. 输入电子邮件并通过

  4. 其余的api返回"登录成功"

  5. $ state.go('app.profile')工作并重定向到http:// localhost:8100 /#/ app/profile

  6. REST get api/logged_in返回false,然后重定向到登录页面

如果我在常规浏览器中执行相同操作,则步骤1变为:打开浏览器并转到http:// localhost:8888/App/www /#/ app/login,在步骤6 REST get api/logged_in返回true并且我不要没有重定向到登录页面,我留在个人资料页面.

代码是一样的.所以我的猜测是,ion_auth可能无法获得它想要的cookie或会话被重置.我不确定这个问题是什么.这是我的第一个Ionic/App项目,所以我可能会错过一些使用在浏览器中运行的代码从移动应用程序进行身份验证的正确方法

谢谢

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

Bip*_*ari 2

您正在学习 REST api、cookie 和会话。Cookie 和会话不符合 REST 理念。这就是原因。

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

我们通常更喜欢基于令牌的授权系统。当登录成功时,服务器发送一个令牌。在 ionic 应用程序中,我们使用factory称为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;
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

SessionService.getUser().token现在在每个网络请求中,您可以在设置值标头时调用Authorization

更新:

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

如果您使用 CORS 发送请求,Angular 不会随请求发送 Cookie。解决此问题的方法之一是withCredentials: true随每个请求一起发送:

$http({withCredentials: true, ...}).get(...)
Run Code Online (Sandbox Code Playgroud)

请在此处阅读更多相关内容。

希望这可以帮助!