Using nsILoginManager
MDC
이 문서는 Firefox 개발자들을 위한 정보입니다. Firefox 3
목차 |
[편집] 로그인 관리자로 작업 하기
확장은 종종 외부 사이트나 웹 애플리케이션 등의 암호를 안전하게 저장할 필요가 있습니다. 그러기 위해서는 민감한 암호 정보를 저장하기 위한 안전한 저장소를 제공하는 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);
주의: httprealm과 formSubmitURL 매개 변수가 모두NULL이면 여기에서 예외가 발생합니다. 암호를 저장하려면 하나를 지정해야 합니다. hostname, username, password 매개 변수 또한 필수입니다.
[편집] 암호 구하기
로그인 관리자에서 암호를 구하는 것은 약간 더 어렵습니다. 암호를 찾으려면 hostname, formSubmitURL, httprealm이 찾을 암호를 위해 저장된 것과 정확하게 일치해야 합니다. 유일한 예외는 저장된 formSubmitURL이 비어 있으면 이 경우에 formSubmitURL 매개 변수는 무시한다는 것입니다. hostname과 formSubmitURL 인수는 전체 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()를 호출하는 것이므로 두 가지 모두와 같은 주의 사항이 있습니다. 즉, oldLogin은 기존 로그인과 정확하게 일치해야 하고 (위를 참고) newLogin 속성은 올바르게 지정되야 합니다.
myLoginManager.modifyLogin(oldLogin, newLogin);
[편집] 디버깅
로그인 관리자 구현은 오류 콘솔로 디버그 메시지를 보내는 것이 가능한데, 이는 하고 있는 일을 어느 정도 보여줍니다. 디버그 로깅을 활성화하려면 http://wiki.mozilla.org/Firefox:Password_Manager_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
}