Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

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('https://www.example.com',
                       'https://login.example.com', null,
                       'joe', 'SeCrEt123', 'uname', 'pword');

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

 
  <form action="https://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('https://www.example.com',
                       null, 'ExampleCo Login',
                       'alice', 'SeCrEt321', null, null);

이는 서버가 다음과 같은 응답을 보낼 때 https://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 = 'https://www.example.com';
var formSubmitURL = 'https://www.example.com';  // not https://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 = 'https://www.example.com';
var formSubmitURL = 'https://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);

디버깅

로그인 관리자 구현은 오류 콘솔로 디버그 메시지를 보내는 것이 가능한데, 이는 하고 있는 일을 어느 정도 보여줍니다. 디버그 로깅을 활성화하려면 https://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,