10

Ionic を使用して Codeigniter/Ion_Auth/codeigniter-restclient の上にログイン システムを構築しています。「ionic サーバー」からログインしようとすると、ログインは機能しますが、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 をテストします。

4

1 に答える 1

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;
        }
    }
})

SessionService.getUser().token現在、すべての Web リクエストで、値Authorizationヘッダーを設定するときに呼び出すことができます。

アップデート:

Cookie の使用は推奨されていませんが、アプリケーションで簡単に使用できます。

CORS でリクエストを送信している場合、Angular はリクエストで Cookie を送信しません。この問題に対処する方法の 1 つは、withCredentials: trueすべてのリクエストで送信することです。

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

詳細については、こちらをご覧ください。

お役に立てれば!

于 2015-05-31T02:56:15.923 に答える