node.js에 대한 사용자 인증 라이브러리?
node.js에 대한 기존 사용자 인증 라이브러리가 있습니까?특히 사용자에 대해 사용자 정의 백엔드 인증 DB를 사용하여 암호 인증을 수행하고 해당 사용자를 세션에 연결할 수 있는 기능을 찾고 있습니다.
제가 저자 도서관을 쓰기 전에, 저는 사람들이 기존 도서관에 대해 알고 있는지 볼 것이라고 생각했습니다.구글 검색을 통해 명백한 것을 찾을 수 없었습니다.
-슈레아스
Connector Express에 대한 인증 프레임워크를 찾고 있다면 Passport는 조사할 가치가 있습니다. https://github.com/jaredhanson/passport
(공개:저는 패스포트 개발자입니다.
저는 connect-auth와 every auth를 모두 조사한 후 Passport를 개발했습니다.둘 다 훌륭한 모듈이지만, 제 요구에 맞지 않았습니다.저는 좀 더 가볍고 눈에 띄지 않는 것을 원했습니다.
Passport는 별도의 모듈로 구분되므로 필요한 것만 사용하도록 선택할 수 있습니다(OAuth, 필요한 경우에만 해당).또한 Passport는 응용프로그램에 경로를 마운트하지 않으므로 인증을 원하는 시기와 위치를 유연하게 결정할 수 있으며 인증이 성공하거나 실패할 때 수행되는 작업을 제어할 수 있습니다.
예를 들어, 다음은 양식 기반(사용자 이름 및 암호) 인증을 설정하는 2단계 프로세스입니다.
passport.use(new LocalStrategy(
function(username, password, done) {
// Find the user from your DB (MongoDB, CouchDB, other...)
User.findOne({ username: username, password: password }, function (err, user) {
done(err, user);
});
}
));
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login' }),
function(req, res) {
// Authentication successful. Redirect home.
res.redirect('/');
});
Facebook, Twitter 등을 통한 인증을 위한 추가 전략이 있습니다.필요한 경우 사용자 지정 전략을 연결할 수 있습니다.
세션 + 경우
좋은 라이브러리를 많이 찾지 못한 이유는 인증을 위해 라이브러리를 사용하는 것이 대부분 과도하게 설계되었기 때문이라고 생각합니다.
찾고 있는 것은 세션 바인더일 뿐입니다. :) 다음을 포함하는 세션:
if login and user == xxx and pwd == xxx
then store an authenticated=true into the session
if logout destroy session
그게 다야.
저는 connect-auth 플러그인이 최선의 방법이라는 당신의 결론에 동의하지 않습니다.
connect도 사용하지만 connect-auth는 두 가지 이유로 사용하지 않습니다.
IMHO는 매우 강력하고 읽기 쉬운 연결 구조인 connect-auth를 해제합니다.절대 안 됩니다 - 제 의견은 :).커넥트가 어떻게 작동하는지와 양파 링 아이디어에 대한 매우 좋고 짧은 기사를 여기에서 찾을 수 있습니다.
작성된 대로 데이터베이스 또는 파일과 함께 기본 또는 http 로그인만 사용하려는 경우.연결 인증이 너무 큽니다.그것은 OAuth 1.0, OAuth 2.0 & Co와 같은 것들에 더 적합합니다.
연결을 통한 매우 간단한 인증
(완료되었습니다.테스트를 위해 실행하기만 하면 되지만 실제 운영에서 사용하려면 https를 사용해야 합니다. (그리고 REST-Principle-Compliance가 되려면 GET-Request b/c 대신 POST-Request를 사용해야 합니다.)
var connect = require('connect');
var urlparser = require('url');
var authCheck = function (req, res, next) {
url = req.urlp = urlparser.parse(req.url, true);
// ####
// Logout
if ( url.pathname == "/logout" ) {
req.session.destroy();
}
// ####
// Is User already validated?
if (req.session && req.session.auth == true) {
next(); // stop here and pass to the next onion ring of connect
return;
}
// ########
// Auth - Replace this example with your Database, Auth-File or other things
// If Database, you need a Async callback...
if ( url.pathname == "/login" &&
url.query.name == "max" &&
url.query.pwd == "herewego" ) {
req.session.auth = true;
next();
return;
}
// ####
// This user is not authorized. Stop talking to him.
res.writeHead(403);
res.end('Sorry you are not authorized.\n\nFor a login use: /login?name=max&pwd=herewego');
return;
}
var helloWorldContent = function (req, res, next) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('authorized. Walk around :) or use /logout to leave\n\nYou are currently at '+req.urlp.pathname);
}
var server = connect.createServer(
connect.logger({ format: ':method :url' }),
connect.cookieParser(),
connect.session({ secret: 'foobar' }),
connect.bodyParser(),
authCheck,
helloWorldContent
);
server.listen(3000);
메모
저는 1년 이상 전에 이 성명서를 작성했으며 현재 활성 노드 프로젝트가 없습니다.그래서 Express에 API-Changes가 있을 수 있습니다.제가 변경해야 할 사항이 있으면 댓글을 달아주세요.
커넥트 미들웨어에 대한 connect-auth 플러그인이 정확히 필요한 것 같습니다.
나는 express [ http://expressjs.com ]를 사용하고 있으므로 express 플러그인은 connect에서 하위 분류(ok - prototype)되기 때문에 매우 잘 맞습니다.
저는 기본적으로 같은 것을 찾고 있었습니다.구체적으로, 저는 다음을 원했습니다.
- Connect의 미들웨어 기능을 래핑하는 express.js를 사용하려면
- "양식 기반" 인증
- 인증된 경로에 대한 세부적인 제어
- 사용자/암호를 위한 데이터베이스 백엔드
- 세션 사용
가 하게 된 기능을 이었습니다.check_auth인증을 원하는 각 경로에 인수로 전달합니다. check_auth에서는 세션만 확인하고 사용자가 로그인하지 않은 경우 다음과 같이 로그인 페이지로 리디렉션합니다.
function check_auth(req, res, next) {
// if the user isn't logged in, redirect them to a login page
if(!req.session.login) {
res.redirect("/login");
return; // the buck stops here... we do not call next(), because
// we don't want to proceed; instead we want to show a login page
}
// the user is logged in, so call next()
next();
}
그런 다음 각 경로에 대해 이 기능이 미들웨어로 전달되는지 확인합니다.예:
app.get('/tasks', check_auth, function(req, res) {
// snip
});
마지막으로 로그인 프로세스를 실제로 처리해야 합니다.이것은 간단합니다.
app.get('/login', function(req, res) {
res.render("login", {layout:false});
});
app.post('/login', function(req, res) {
// here, I'm using mongoose.js to search for the user in mongodb
var user_query = UserModel.findOne({email:req.body.email}, function(err, user){
if(err) {
res.render("login", {layout:false, locals:{ error:err } });
return;
}
if(!user || user.password != req.body.password) {
res.render("login",
{layout:false,
locals:{ error:"Invalid login!", email:req.body.email }
}
);
} else {
// successful login; store the session info
req.session.login = req.body.email;
res.redirect("/");
}
});
});
어쨌든, 이 접근 방식은 대부분 유연하고 단순하도록 설계되었습니다.저는 그것을 개선할 수 있는 많은 방법들이 있다고 확신합니다.만약 있다면, 저는 당신의 피드백을 매우 받고 싶습니다.
편집: 이것은 단순화된 예입니다.프로덕션 시스템에서는 암호를 일반 텍스트로 저장하고 비교하지 않습니다.논평가가 지적했듯이, 비밀번호 보안을 관리하는 데 도움이 될 수 있는 립이 있습니다.
또한 타사/소셜 네트워크 로그인 통합을 원하는 경우 모든 인증을 확인합니다.
여기 제 프로젝트 중 하나에서 기본 인증을 위한 코드가 있습니다.CouchDB에 대해 인증 데이터 캐시와 함께 사용하지만 코드를 제거했습니다.
처리를 요청하는 인증 방법을 지정하고 인증이 실패할 경우 두 번째 콜백을 제공합니다.성공적인 콜백은 사용자 이름을 추가 매개 변수로 가져옵니다.실패 콜백에서 잘못되었거나 누락된 자격 증명이 있는 요청을 올바르게 처리하는 것을 잊지 마십시오.
/**
* Authenticate a request against this authentication instance.
*
* @param request
* @param failureCallback
* @param successCallback
* @return
*/
Auth.prototype.authenticate = function(request, failureCallback, successCallback)
{
var requestUsername = "";
var requestPassword = "";
if (!request.headers['authorization'])
{
failureCallback();
}
else
{
var auth = this._decodeBase64(request.headers['authorization']);
if (auth)
{
requestUsername = auth.username;
requestPassword = auth.password;
}
else
{
failureCallback();
}
}
//TODO: Query your database (don't forget to do so async)
db.query( function(result)
{
if (result.username == requestUsername && result.password == requestPassword)
{
successCallback(requestUsername);
}
else
{
failureCallback();
}
});
};
/**
* Internal method for extracting username and password out of a Basic
* Authentication header field.
*
* @param headerValue
* @return
*/
Auth.prototype._decodeBase64 = function(headerValue)
{
var value;
if (value = headerValue.match("^Basic\\s([A-Za-z0-9+/=]+)$"))
{
var auth = (new Buffer(value[1] || "", "base64")).toString("ascii");
return {
username : auth.slice(0, auth.indexOf(':')),
password : auth.slice(auth.indexOf(':') + 1, auth.length)
};
}
else
{
return null;
}
};
몇 년이 지났고 저는 익스프레스에 대한 인증 솔루션을 소개하려고 합니다.그것은 Lockit이라고 불립니다.당신은 GitHub에서 프로젝트를 찾을 수 있고 내 블로그에서 간단한 소개를 찾을 수 있습니다.
그렇다면 기존 솔루션과의 차이점은 무엇입니까?
- , 설치, DB 설정, npm 설정,
require('lockit'),lockit(app),다 했어요. - 이미 기본 제공된 경로(/signup, /syslog, /syslog-password 등)
- 이미 기본 제공된 보기(Bootstrap 기반이지만 사용자 자신의 보기를 쉽게 사용할 수 있음)
- AngularJS / Ember.js 단일 페이지 앱에 대한 JSON 통신을 지원합니다.
- OAuth and Open을 지원하지 않습니다. 아만디만.
username그리고.password. - 여러 데이터베이스(CouchDB, MongoDB, SQL)를 즉시 사용할 수 있습니다.
- 테스트가 있습니다(Drywall에 대한 테스트를 찾을 수 없습니다).
- (모든 인증에 대해) 적극적으로 유지 관리됩니다.
- 전자 메일 확인 및 암호를 잊어버린 경우(토큰으로 전자 메일 보내기, Passport에서 지원되지 않음
- 모듈화: 필요한 것만 사용
- 유연성: 모든 것을 사용자 정의
예를 들어 보겠습니다.
인증에 대한 또 다른 관점은 Passwordless입니다. Passwordless는 암호의 본질적인 문제를 방지하는 Express용 토큰 기반 인증 모듈입니다 [1].구현 속도가 빠르고, 많은 양식을 필요로 하지 않으며, 일반 사용자에게 더 나은 보안을 제공합니다(전체 공개:제가 저자입니다.
: 암호가 사용되지 않음
핸들링 접근법에 대한 주의 사항:
이 게시물에서 제안된 코드 예제 중 일부가 세션 고정 또는 타이밍 공격과 같은 기본적인 인증 취약성을 보호하지 못하는 것을 보니 실망스럽습니다.
여기에 제시된 여러 제안과 달리 인증은 간단하지 않으며 솔루션을 처리하는 것이 항상 사소한 것은 아닙니다.저는 passportjs와 bcrypt를 추천합니다.
그러나 솔루션을 수동으로 실행하기로 결정한 경우 영감의 예로 제공된 express js를 살펴봅니다.
행운을 빌어요.
Passport로 사용자 로그인 시스템을 구현하는 Drywall이라는 프로젝트가 있으며 사용자 관리 패널도 있습니다.Django가 가지고 있는 것과 유사한 완전한 기능을 갖춘 사용자 인증 및 관리 시스템을 찾고 있지만 Node.js의 경우는 이것으로 끝입니다.사용자 인증 및 관리 시스템이 필요한 노드 앱을 구축하는 데 정말 좋은 출발점이 되었습니다.Passport 작동 방식에 대한 자세한 내용은 Jared Hanson의 답변을 참조하십시오.
다음은 노드 Js 인증을 위한 두 가지 인기 있는 Github 라이브러리입니다.
https://github.com/jaredhanson/passport (제안 가능)
https://nodejsmodules.org/pkg/everyauth
iEngular 클라이언트에 대한 사용자 인증을 제공하는 API에 대해 mongo를 사용하는 간단한 예
app.js로
var express = require('express');
var MongoStore = require('connect-mongo')(express);
// ...
app.use(express.cookieParser());
// obviously change db settings to suit
app.use(express.session({
secret: 'blah1234',
store: new MongoStore({
db: 'dbname',
host: 'localhost',
port: 27017
})
}));
app.use(app.router);
당신의 경로는 다음과 같습니다.
// (mongo connection stuff)
exports.login = function(req, res) {
var email = req.body.email;
// use bcrypt in production for password hashing
var password = req.body.password;
db.collection('users', function(err, collection) {
collection.findOne({'email': email, 'password': password}, function(err, user) {
if (err) {
res.send(500);
} else {
if(user !== null) {
req.session.user = user;
res.send(200);
} else {
res.send(401);
}
}
});
});
};
그런 다음 인증이 필요한 경로에서 사용자 세션을 확인할 수 있습니다.
if (!req.session.user) {
res.send(403);
}
타임스탬프가 지정된 토큰을 사용하는 새 인증 라이브러리가 있습니다.토큰을 데이터베이스에 저장할 필요 없이 사용자에게 전자 메일로 보내거나 텍스트로 보낼 수 있습니다.암호 없는 인증 또는 2단계 인증에 사용할 수 있습니다.
https://github.com/vote539/easy-no-password
공개:저는 이 도서관의 개발자입니다.
마이크로소프트 윈도우즈 사용자 계정으로 SSO(Single Sign On) 인증이 필요한 경우.당신은 https://github.com/jlguenego/node-expose-sspi 을 시도해 볼 수 있습니다.
그것은 당신에게 줄 것입니다.req.sso모든 클라이언트 사용자 정보(이름, 표시 이름, sid, 그룹)를 포함하는 개체입니다.
const express = require("express");
const { sso, sspi } = require("node-expose-sspi");
sso.config.debug = false;
const app = express();
app.use(sso.auth());
app.use((req, res, next) => {
res.json({
sso: req.sso
});
});
app.listen(3000, () => console.log("Server started on port 3000"));
고지 사항:저는 node-expose-sspi의 저자입니다.
간결한
경량의 제로 구성 사용자 인증 모듈.고정 데이터베이스가 필요하지 않습니다.
https://www.npmjs.com/package/slimauth
다음과 같이 간단합니다.
app.get('/private-page', (req, res) => {
if (req.user.isAuthorized) {
// user is logged in! send the requested page
// you can access req.user.email
}
else {
// user not logged in. redirect to login page
}
})
언급URL : https://stackoverflow.com/questions/3498005/user-authentication-libraries-for-node-js
'programing' 카테고리의 다른 글
| 스위프트에서 오브젝티브-C 코드를 어떻게 부르나요? (0) | 2023.05.28 |
|---|---|
| http 핸들러 인터페이스에서 boolIsReuseable의 중요성 (0) | 2023.05.23 |
| 컨트롤러 .NET MVC에서 URL 생성 (0) | 2023.05.23 |
| Dim과 Private의 차이 (0) | 2023.05.23 |
| 지정된 DateTime 개체를 사용하여 월의 첫 번째 및 마지막 날 가져오기 (0) | 2023.05.23 |