10

我正在使用 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 针对最后一个会话测试已登录的登录,其中不包含登录详细信息。

4

1 回答 1

2

您正在学习 REST api、cookie 和会话。Cookie 和会话不符合 REST 哲学。这就是为什么。

让我告诉你我们是如何在我们的项目中解决这个问题的。了解哪个用户正在请求以及是否具有访问权限的基本方法是通过“授权”标头值。您可以使用基本身份验证、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;
        }
    }
})

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

更新:

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

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

$http({withCredentials: true, ...}).get(...)

在此处进一步了解此内容。

希望这可以帮助!

于 2015-05-31T02:56:15.923 回答