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
}

 

 

 

 

문서 태그 및 공헌자

태그: 
 이 페이지의 공헌자: teoli, Jeongkyu
 최종 변경: teoli,