2016-07-29 5 views
2

내 AuthController.js에서 나는 검사 할 때 로그인 사점 경우 설정하고 세션에서의 해시 코드를 설정되지 않은 :Passport.js 세션은 로그인 안드로이드

req.logIn(user, function (err) { 
       if (err) res.send(err); 
       var redirectTo = req.session.redirectTo ? req.session.redirectTo : '/user/show/'+user.id; 
       delete req.session.redirectTo; 

       bcrypt.genSalt(10, function (err, salt) { 
        bcrypt.hash(user.email, salt, function (err, hash) { 
         if (err) { 
          console.log(err); 
         } else { 


          req.session.passport.user_type = user.type; 
          req.session.passport.user_avatar = user.avatar; 
          req.session.passport.email = user.email; 
          req.session.passport.token = hash; 

          // here session is set! also when login with Android 
           console.log("User passport Sessions: ",req.session.passport) 

           res.json(user); 
           res.end(); 

         } 
        }); 
       }) 

      }) 

내가 브라우저로 로그인 할 때 세션이 설정되어 내가 예상대로 내 안드로이드 응용 프로그램 (발리 요청) 모든 작업에 로그인하면

'who': function (req, res) { 
     res.json(req.session); 
    }, 

,하지만 난 후 성공적으로 로그인 한 후이 '사람'컨트롤러에 새로운 요청을 할 때 - 나는 다른 간단한 컨트롤러를 확인 , 전체 '여권'속성은 널입니다.

안드로이드 앱으로 로그인 할 때 여권 세션이 설정되지 않는 이유는 무엇입니까?

질문 : 발리 요청이 브라우저 요청과 다른가요? 서버가 발리 요청에 대한 세션을 저장할 수없는 경우 서버에서 사용자가 이미 로그인 한 것을 (두 번째 요청시) 어떻게 알 수 있습니까? 한편 - 세션 부분이없는

{ 'user-agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0; Android SDK built for x86 Build/MASTER)', 
    host: '10.0.2.2:1337', 
    connection: 'Keep-Alive', 
    'accept-encoding': 'gzip' } 
{ 'if-none-match': 'W/"1f3e-WoreHgYUy3uvXGNH++ttsQ"', 
    'user-agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0; Android SDK built for x86 Build/MASTER)', 
    host: '10.0.2.2:1337', 
    connection: 'Keep-Alive', 
    'accept-encoding': 'gzip' } 

:

{ host: 'localhost:1337', 
    connection: 'keep-alive', 
    'cache-control': 'max-age=0', 
    'upgrade-insecure-requests': '1', 
    'user-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36', 
    accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
    'accept-encoding': 'gzip, deflate, sdch', 
    'accept-language': 'de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4', 
    cookie: '__utma=111872281.1508283337.1455636609.1455636609.1455636609.1; __utmz=111872281.1455636609.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _ga=GA1.1.1508283337.1455636609; sails.sid=s%3AHNW3D3ktwA79IFHH4gX9Ko6o73MZOjRK.I7sTYkCKSkkwset6OC2ap58fcROPtV6PqUnkaInGW44', 
    'if-none-match': 'W/"1f3e-WoreHgYUy3uvXGNH++ttsQ"' } 

그리고이 같은 발리 이상의 안드로이드 요청이 모습입니다 : 크롬과 같은 방법

나는 req.headers 덤프

이있다 나 자신이 세션 관리를 구현해야한다는 것을 알고있다. 세션이있는 Volley에 대한 여러 HTTP 요청에 대한 간단한 자습서가 있습니까?

답변

2

10 일 후에 나는 이것을 "고치는"방법을 안다.

서버에 요청을하면 여러 가지 문제가 발생합니다. 헤더는 우리에게 중요한 것입니다.

여기에 HTTP 헤더에 대해 자세히 알아보기 : http://code.tutsplus.com/tutorials/http-headers-for-dummies--net-8039

HTTP 요청 즉, 그것은 정보를 저장하고 클라이언트에 대해 언급하지 않는, 비 상태입니다.

발리는 헤더를 처리하지 않습니다. 우리가해야할 일은 다음과 같습니다.

우리의 앱에서 첫 번째 요청을 만들 때 응답 헤더 정보를 저장해야합니다.

{"Access-Control-Allow-Credentials":"","Access-Control-Allow-Headers":"","Access-Control-Allow-Methods":"","Access-Control-Allow-Origin":"","Access-Control-Expose-Headers":"","Connection":"keep-alive","Content-Length":"235","Content-Type":"application\/json; charset=utf-8","Date":"Tue, 09 Aug 2016 22:39:40 GMT","ETag":"W\/\"eb-bxZXjFIir0ihzYNPgoUbTg\"","set-cookie":"sails.sid=s%3AsjQL1FsAJY5VWGHdgChpa0hgZPs06AH9z.H1RLNh%2FMqLjxdGtKtnWFv8cFO8WjeAUhPFQp2Yl73Lo; Path=\/; HttpOnly","Vary":"X-HTTP-Method-Override","X-Android-Received-Millis":"1470713694296","X-Android-Response-Source":"NETWORK 200","X-Android-Selected-Protocol":"http\/1.1","X-Android-Sent-Millis":"1470713694119","X-Powered-By":"Sails <sailsjs.org>"} 

헤더의 중요한 정보는 "세트 - 쿠키"부분입니다. 첫 번째 호출에서이 정보를 저장하고 다음 요청마다 다시 사용해야하므로 서버가 현재 사용자인지 알 수 있습니다.

어떻게?

나는 djodjo의이 사용자 지정 요청을 사용했습니다. 중요한 방법은 parseNetworkResponse입니다 : https://stackoverflow.com/a/36435582/3037960

그리고 우리는이 같은 클래스를 사용 : 당신이 세션 관리자 ... 세션으로 라인을 참조

mHeaders = new HashMap<String, String>(); 
    session = new SessionManager(myView.getContext()); 

registerRequest = new MetaRequest(1, MY_ENDPOINT, obj, new Response.Listener<JSONObject>() { 

        @Override 
         public void onResponse(JSONObject response) { 

          JSONObject headers = new JSONObject(); 
          try { 
           headers.put("headers", response.get("headers")); 
    // get the "set-cookie" value 
           String sailsSession = String.valueOf(headers.getJSONObject("headers").get("set-cookie")); 
           Log.d("Response Headers", sailsSession); 

           // Session Manager 
           session.storeSailsSession(sailsSession); 

           String cookie = session.getSailsSession(); 

           if(cookie != null) { 
            //just to test if the cookie is now saved? 
            Log.d("Cookies", cookie); 
           } 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 

         } 
        }, new Response.ErrorListener() { 

         @Override 
         public void onErrorResponse(VolleyError error) { 
           Log.d("ERROR", String.valueOf(error)); 
          // TODO Auto-generated method stub 

         } 
        }){ 

         public Map<String, String> getHeaders() { 
          return mHeaders; 
         } 
        }; 

        RequestQueue queue = Volley.newRequestQueue(getActivity()); 
        queue.add(registerRequest); 

합니다.storeSailsSession (sailsSession); 이것은 공유 환경 설정에 쿠키를 저장하기위한 맞춤 클래스로, 필요할 때마다 앱에서이 정보를 얻을 수 있습니다.

public class SessionManager { 
    // Shared Preferences 
    SharedPreferences pref; 

    // Editor for Shared preferences 
    Editor editor; 

    // Context 
    Context _context; 


    // User hash/cookie 
    public static final String KEY_SESSION = "session"; 

    // Constructor 
    public SessionManager(Context context){ 
     this._context = context; 
     pref = _context.getSharedPreferences(PREF_NAME, 0); 
     editor = pref.edit(); 
    } 


    public void storeSailsSession(String session){ 
     editor.putString(KEY_SESSION,session); 
     editor.commit(); 

     } 
public String getSailsSession(){ 
     return pref.getString(KEY_SESSION,null); 
    } 

    } 

이제 헤더에서 쿠키를 얻는 방법, 나중에 저장하는 방법을 볼 수 있습니다. 이제 nex 요청에 헤더를 설정하는 방법은 무엇입니까?

String sailsCookie = session.getSailsSession(); 
mHeaders.put("cookie", sailsCookie.toString()); 

: 당신은 당신이 공유 환경 설정에서 세션을 가져온 다음 해시 맵 mHeaders에서 설정해야합니다 (위부터 사용자 정의 MetaRequest를 사용할 필요가 없습니다) 요청을 보내기 전에

mHeaders이 같은 요청에 것을 반환하는 것을 잊지 마세요 :

JsonArrayRequest arrayreq = new JsonArrayRequest(JsonURL,Listener,ErrorListener){ 
       public Map<String, String> getHeaders() { 
        return mHeaders; 
       } 
} 

일반적으로 만 (....) 새로운 WhatEverRequest를 사용;하지만 지금은 당신이 첨부해야 {... 반환 mHeaders을}

나는 내가 그것을 설명 할 것이다, 그렇지 않으면 단지 의견을, 당신이 그것을 이해할 수 있기를 바랍니다. 저에게 그것은 효과가 있었기 때문에 그것은 또한 당신을 위해 효과가있을 것이라고 확신합니다. 다음 번에 사용할 것을 권합니다. https://jwt.io

+0

다시 1.5 개월 후 : 다시 사용하십시오! 개량은 1000 배 더 쉽고 더 좋아 - 나는 그것을 알고 싶다 https://futurestud.io/tutorials/retrofit-add-custom-request-header – Suisse