mozilla
검색 결과

    Using nsILoginManager

    로그인 관리자로 작업 하기

    확장은 종종 외부 사이트나 웹 애플리케이션 등의 암호를 안전하게 저장할 필요가 있습니다. 그러기 위해서는 민감한 암호 정보를 저장하기 위한 안전한 저장소를 제공하는 nsILoginManager와 로그인 정보를 저장하는 방법을 제공하는 nsILoginInfo를 사용할 수 있습니다.

    nsILoginManager 얻기

    nsILoginManager를 구현한 콤포넌트를 얻으려면 다음 코드를 사용합니다.

    var passwordManager = Components.classes["@mozilla.org/login-manager;1"]
                                    .getService(Components.interfaces.nsILoginManager);
    

    대부분의 로그인 관리자 함수는 nsILoginInfo 개체를 매개 변수로 취합니다. nsILoginInfo 개체는 다음과 같은 속성을 포함합니다: hostname, form submit URL, HTTP realm, username, username field, password, password field. hostname, username, password는 필수 속성이지만 기타 필드는 로그인이 웹 페이지 양식을 위한 것인지 아니면 HTTP/FTP 인증 사이트 로그인인지에 따라 설정됩니다. 자세한 정보는 nsILoginInfo 속성 정의를 참고하시기 바랍니다. nsILoginInfo 개체를 정의하는 것은 간단합니다.

    var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",
                                                 Components.interfaces.nsILoginInfo,
                                                 "init");
    	  
    var loginInfo = new nsLoginInfo(hostname, formSubmitURL, httprealm, username, password,
                                    usernameField, passwordField);
    

    예제

    웹 페이지를 위한 로그인 생성

     var formLoginInfo = new nsLoginInfo('http://www.example.com',
                           'http://login.example.com', null,
                           'joe', 'SeCrEt123', 'uname', 'pword');
    

    이 로그인은 다음과 같은 HTML 양식에 해당합니다.

     
      <form action="http://login.example.com/foo/authenticate.cgi">
      Please log in.
      Username: <input type="text"     name="uname">
      Password: <input type="password" name="pword">
      </form>
      
    

    사이트 인증 로그인 생성

     var authLoginInfo = new nsLoginInfo('http://www.example.com',
                           null, 'ExampleCo Login',
                           'alice', 'SeCrEt321', null, null);
    

    이는 서버가 다음과 같은 응답을 보낼 때 http://www.example.com에 로그인 하는 것에 해당합니다.

     HTTP/1.0 401 Authorization Required
     Server: Apache/1.3.27
     WWW-Authenticate: Basic realm="ExampleCo Login"
    

    지역 확장 로그인 생성

     var extLoginInfo = new nsLoginInfo('chrome://firefoo',
                          'User Registration', null,
                          'bob', '123sEcReT', null, null);
    

    로그인 관리자는 이를 웹 사이트 로그인인 것처럼 취급합니다. 다른 확장과 충돌을 피하려면 확장의 chrome:// URL과 로그인의 목적을 나타내는 영역 문자열을 사용해야 합니다.

    암호 저장하기

    로그인 관리자에 암호를 저장하려면 먼저 위에서 정의한 대로 nsILoginInfo 개체를 생성해야 합니다. 그리고 나서 간단하게 nsILoginManager의 메소드인 addLogin()를 호출합니다.

     myLoginManager.addLogin(loginInfo);
    

    주의: <tt>httprealm</tt>과 <tt>formSubmitURL</tt> 매개 변수가 모두 NULL이면 여기에서 예외가 발생합니다. 암호를 저장하려면 하나를 지정해야 합니다. <tt>hostname</tt>, <tt>username</tt>, <tt>password</tt> 매개 변수 또한 필수입니다.

    암호 구하기

    로그인 관리자에서 암호를 구하는 것은 약간 더 어렵습니다. 암호를 찾으려면 <tt>hostname</tt>, <tt>formSubmitURL</tt>, <tt>httprealm</tt>이 찾을 암호를 위해 저장된 것과 정확하게 일치해야 합니다. 유일한 예외는 저장된 <tt>formSubmitURL</tt>이 비어 있으면 이 경우에 <tt>formSubmitURL</tt> 매개 변수는 무시한다는 것입니다. <tt>hostname</tt>과 <tt>formSubmitURL</tt> 인수는 전체 URL의 경로를 포함하면 안된다는 점에 주의하십시오. 아래 예제는 양식 로그인을 위한 시작점을 제공할 것입니다.

    var hostname = 'http://www.example.com';
    var formSubmitURL = 'http://www.example.com';  // not http://www.example.com/foo/auth.cgi
    var httprealm = null;
    var username = 'user';
    var password;
    
    try {
       // Get Login Manager 
       var myLoginManager = Components.classes["@mozilla.org/login-manager;1"]
                             .getService(Components.interfaces.nsILoginManager);
    	  
       // Find users for the given parameters
       var logins = myLoginManager.findLogins({}, hostname, formSubmitURL, httprealm);
          
       // Find user from returned array of nsILoginInfo objects
       for (var i = 0; i < logins.length; i++) {
          if (logins[i].username == username) {
             password = logins[i].password;
             break;
          }
       }
    }
    catch(ex) {
       // This will only happen if there is no nsILoginManager component class
    }
    

    사용자가 암호를 안전하게 보관하도록 마스터 암호를 지정했다면 이를 입력하라는 요청을 받게 된다는 점을 참고하십시오.

    암호 제거하기

    암호를 제거하는 것은 간단합니다.

     myLoginManager.removeLogin(loginInfo);
    

    암호를 제거할 때 지정한 nsILoginInfo 개체는 저장된 것과 정확하게 일치해야 하며 그렇지 않으면 예외가 발생합니다. 이는 password 속성을 포함합니다. 여기에 실제로 암호가 무엇인지 모르면서 암호를 제거하는 방법을 보여주는 예제가 있습니다.

    // example values
    var hostname = 'http://www.example.com';
    var formSubmitURL = 'http://www.example.com';
    var httprealm = null;
    var username = 'user';
    
    try {
       // Get Login Manager 
       var passwordManager = Components.classes["@mozilla.org/login-manager;1"]
                             .getService(Components.interfaces.nsILoginManager);
     
       // Find users for this extension 
       var logins = passwordManager.findLogins({}, hostname, formSubmitURL, httprealm);
          
       for (var i = 0; i < logins.length; i++) {
          if (logins[i].username == username) {
             passwordManager.removeLogin(logins[i]);
             break;
          }
       }
    }
    catch(ex) {
       // This will only happen if there is no nsILoginManager component class
    }
    

    저장된 로그인 정보 변경하기

    암호를 변경하는 것은 간단합니다. 여기에서 하는 모든 일은 removeLogin()를 호출하고 나서 addLogin()를 호출하는 것이므로 두 가지 모두와 같은 주의 사항이 있습니다. 즉, <tt>oldLogin</tt>은 기존 로그인과 정확하게 일치해야 하고 (위를 참고) <tt>newLogin</tt> 속성은 올바르게 지정되야 합니다.

    myLoginManager.modifyLogin(oldLogin, newLogin);

    디버깅

    로그인 관리자 구현은 오류 콘솔로 디버그 메시지를 보내는 것이 가능한데, 이는 하고 있는 일을 어느 정도 보여줍니다. 디버그 로깅을 활성화하려면 http://wiki.mozilla.org/Firefox:Pass...ager_Debugging 을 참고하시기 바랍니다.

    Firefox 구 버전 지원

    여러분의 확장이 Firefox 3와 구 버전을 모두 지원하기를 바란다면 nsILoginManagernsIPasswordManager 콤포넌트를 모두 구현해야 합니다. 이를 위한 간단한 방법은 다음과 같습니다.

    if ("@mozilla.org/passwordmanager;1" in Components.classes) {
       // Password Manager exists so this is not Firefox 3 (could be Firefox 2, Netscape, SeaMonkey, etc).
       // Password Manager code
    }
    else if ("@mozilla.org/login-manager;1" in Components.classes) {
       // Login Manager exists so this is Firefox 3
       // Login Manager code
    }
    

     

     

     

     

    문서 태그 및 공헌자

    태그: 
    Contributors to this page: teoli, Jeongkyu
    최종 변경: teoli,