로그인 관리자로 작업 하기
확장은 종종 외부 사이트나 웹 애플리케이션 등의 암호를 안전하게 저장할 필요가 있습니다. 그러기 위해서는 민감한 암호 정보를 저장하기 위한 안전한 저장소를 제공하는 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);
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와 구 버전을 모두 지원하기를 바란다면 nsILoginManager
와 nsIPasswordManager
콤포넌트를 모두 구현해야 합니다. 이를 위한 간단한 방법은 다음과 같습니다.
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 }