여권 직렬화 역직렬화 이해
일반인에게 패스포트의 직렬화 및 역직렬화 방법의 워크플로우를 어떻게 설명하시겠습니까?
는 어디에 ?
user.id
을뒤다를passport.serializeUser
호출되었습니까?전화드렸습니다.
passport.deserializeUser
워크플로우의 어디에 적합합니까?// used to serialize the user for the session passport.serializeUser(function(user, done) { done(null, user.id); // where is this user.id going? Are we supposed to access this anywhere? }); // used to deserialize the user passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); });
나는 아직도 그것에 머리를 싸매고 있습니다.저는 완벽하게 작동하는 앱을 가지고 있으며 어떤 종류의 오류도 발생하지 않습니다.
여기서 정확히 무슨 일이 일어나고 있는지 알고 싶었어요?
어떤 도움이든 감사합니다.
- 는 어디에 ?
user.id
을뒤다를passport.serializeUser
호출되었습니까?
ID는 " " " ID"의 두 합니다.)done
function에 function을 하는 데 됩니다.deserializeUser
기능.
serializeUser
세션에 저장할 사용자 개체의 데이터를 결정합니다. 련의 결과화일메 User 의 가 되어 있습니다.req.session.passport.user = {}
들어 서는 (키로 하므로) 예를들어, 사는서를 (용자키 ID제므로하)가.req.session.passport.user = {id: 'xyz'}
- 전화드렸습니다.
passport.deserializeUser
워크플로우의 어디에 적합합니까?
번째주의 첫 deserializeUser
에 주어진 사용자 객체의 키에 해당합니다.done
함수. 조참) 그래서 의 전체 은 그 됩니다.그래서 당신의 전체 객체는 그 키의 도움으로 검색됩니다.여기서 해당 키는 사용자 ID(이름, 전자 메일 등 사용자 개체의 모든 키일 수 있음)입니다.deserializeUser
이 키는 메모리 배열/데이터베이스 또는 모든 데이터 리소스와 일치합니다.
에 가온개체개다체음같연과결이다니됩에로 됩니다.req.user
시각적 흐름
passport.serializeUser(function(user, done) {
done(null, user.id);
}); │
│
│
└─────────────────┬──→ saved to session
│ req.session.passport.user = {id: '..'}
│
↓
passport.deserializeUser(function(id, done) {
┌───────────────┘
│
↓
User.findById(id, function(err, user) {
done(err, user);
}); └──────────────→ user object attaches to the request as req.user
});
Koa 및 Koa-Passport를 사용하는 모든 사용자:
serialize에 설정된 사용자의 키를 확인합니다.사용자 메서드(종종 해당 사용자의 고유 ID)는 다음 위치에 저장됩니다.
this.session.passport.user
에 할 때done(null, user)
역직렬화하여user 여기서 'user'는 데이터베이스의 일부 사용자 개체입니다.
this.req.user
ORthis.passport.user
this.user
deserialized deserialize에서 (null, 을 하면 koa 컨텍스트가 되지 않습니다.사용자 방법.
따라서 app.use(passport.session()) 호출 후에 자신의 미들웨어를 작성하여 다음과 같이 입력할 수 있습니다.user:
app.use(function * setUserInContext (next) {
this.user = this.req.user
yield next
})
연쇄 살인범들이 어떻게 연쇄 살인범들을사용자 및 역직렬화사용자 작업, 트위터로 연락 주세요.@yvanscher
은 여권사를 합니다.serializeUser
(인증에 성공한 후) 사용자 데이터를 세션으로 유지하는 기능입니다. 기.deserializeUser
세션에서 사용자 데이터를 검색하는 데 사용됩니다.
둘다요.serializeUser
그리고.deserializeUser
전달받은 function, type function이면 function, function,serializeUser
그리고.deserializeUser
아무 것도 하지 않고 함수 스택에 함수를 저장합니다. 함수 스택은 나중에 호출됩니다(전달된 첫 번째 인수가 형식 함수가 아닐 때).세션에서 인증 후 사용자 데이터를 저장하려면 다음 설정이 필요합니다.
app.use(session({ secret: "cats" }));
app.use(passport.initialize());
app.use(passport.session());
중고 미들웨어의 순서가 중요합니다.새 요청이 승인을 위해 시작되면 어떤 일이 발생하는지 확인하는 것이 중요합니다.
는 세션을합니다(" " "의를 사용합니다").
sessionStore
).passport.initialize
할당합니다._passport
to object, object가 는 " ", ", ", ", ", "passport
않으면 - 합니다). 를 해당 존존개재함체에경다에생 - 성해니할), 당개를체합당않우에 할당합니다.session
에 출전하다._passport
마지막에는 다음과 같이 표시됩니다.req._passport.session = req.session['passport']
그렇게,
session
필드 참조 객체, 할당된 객체req.session.passport
.passport.session
.user
에 출전하다.req._passport.session
그리고 만약 하나를 찾으면, 그것을 건네줍니다.deserializeUser
함수를 호출합니다.deserializeUser
는 할함당을 할당합니다.req._passport.session.user
user
요청 개체 필드(에서 찾을 경우)req._passport.session.user
이것이 우리가 사용자 객체를 설정하는 이유입니다.serializeUser
다음과 같은 기능:passport.serializeUser(function(user, done) { done(null, JSON.strignify(user)); });
저장되었기 에 구문 분석이 합니다. 왜냐하면 저장되었기 때문입니다.
JSON
user
선택사항:passport.deserializeUser(function(id, done) { // parsed user object will be set to request object field `user` done(err, JSON.parse(user)); });
그렇게,deserializeUser
은 먼저할 때 을 당이를 Passport설때할정, 의콜다위해먼저기호기능출된넣시을신당신에 넣기 위해됩니다._deserializers
함수 스택.두 번째로, 그것은 소환될 것입니다.passport.session
할당하는 user
요청 개체에 대한 필드입니다.의 콜백 콜백)을 합니다.passport.deserializeUser()
에 ).user
밭.밭.
serializeUser
Passport를 할 때 먼저 Passport와 )deserializeUser
함수)이지만 세션에 저장하기 위해 사용자 개체를 직렬화하는 데 사용됩니다.두 번째로, 그것은 전화될 것입니다, in.login/logIn (alias)
세션에서 사용자 개체를 저장하는 데 사용되는 방법입니다. serializeUser
은 확인합니다._serializers
이미 푸시된 it 기능이 있는 스택(Passport 설정 시 추가된 기능 중 하나):
passport.serializeUser(function(user, done) ...
개체를 " " " " " " " " " " " " " " " " " " " " " 에 합니다.req._passport.session.user
그것을 기억하는 것은 중요합니다.session
가 직접 합니다.passport
에 출전하다.req.session
물건.그런 방식으로 사용자가 세션에 저장되었습니다(왜냐하면req._passport.session
개체 조체req.session.passport
,그리고.req._passport.session
되는 각 에서 수되는 수정니다됩서에 의해 됩니다.passport.initialize
미웨어들끝면나이요). 요청이 끝나면 청이끝,면▁나,req.session
는 데터가저다니됩에 됩니다.sessionStore
.
인증 성공 후 두 번째 요청이 시작될 때 발생하는 작업:
session
는 미들어가기에서 을 얻습니다.sessionStore
데이터가 이미 입니다.passport.initialize
하고 세션을 할당합니다.req.session.passport
req._passport.session
passport.session
req._passport.session.user
역직렬화합니다.이 단계에서 (만약에req._passport.session.user
사실), 우리는 가질 것입니다.req.user
그리고.req.isAuthenticated()
아온다를 합니다.true
.
그래서 저는 이것에 꽤 오래 걸려서 다시는 아무도 이 쓰레기에 걸리지 않도록 빠른 설정 파일을 만들었습니다.
여권 관리.js
const localStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
const User = require('./db-schemas/models').UserModel;
/*^^^^^^^^^^^ delete above import and modify below definition as needed
const mongoose = require('mongoose')
mongoose.connect("mongodb://localhost:27017/database_name");
const UserSchema = new mongoose.Schema({
username: {
type: String,
required: true
},
password: {
type: String,
required: true
},
email: {
type: String,
required: true
}
});
const UserModel = mongoose.model('collection_name', UserSchema);
^^^^^^^^^^^^^^^ Change UserModel to User */
const passport = require('passport');
function passportSetupUwU(app) {
const cookieParser = require('cookie-parser');
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);
app.use(cookieParser());
app.set('trust proxy', 1);
app.use(session({
secret: "secret",
resave: false,
saveUninitialized: false,
store: new MongoDBStore({
uri: "mongodb://localhost:27017/database_name",
collection: "collection_name"
})
}));
// Passport.js
app.use(passport.initialize());
app.use(passport.session());
}
passport.serializeUser(function(user, cb) {
console.log("serializing user uwu:" + JSON.stringify(user))
process.nextTick(function() {
return cb(null, user.id)
})
})
passport.deserializeUser(function (id, cb) {
console.log("deserializing user owo:" + JSON.stringify(id))
User.findOne({id:id}, function (err, user) {
if (err) { return cb(err)}
return cb(null, user);
})
});
passport.use(new localStrategy(function (username, password, done) {
console.log("attempted login with %s:%s", username, password);
User.findOne({ username: username }, function (err, user) {
if (err) return done(err);
if (!user) return done(null, false, { message: 'No such user exists.' });
bcrypt.compare(password, user.password, function (err, res) {
if (err) return done(err);
if (res === false) return done(null, false, { message: 'Incorrect password.' });
return done(null, user);
});
});
}));
module.exports = {setup: passportSetupUwU}
이제 app.js에서 여권SetupUwU 기능을 가져와서 실행하면 됩니다.
app.js extract
// some example middleware and stuff i happened to have
const PPSetup = require('./passportmgmt').setup
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
//
// <- PUT IT LIKE HERE OR SOMETHING
//
PPSetup(app);
// some example routes and api endpoints i happened to have
app.use('/api/', apiRouter);
apiRouter.use('/', indexRouter);
apiRouter.use('/users', usersRouter);
apiRouter.post('/login', passport.authenticate('local', {
이 코드를 사용하여 이전 직렬화 및 역직렬화를 업그레이드할 수 있습니다. 새 솔루션을 사용하려면 이 게시물을 업로드하십시오.
passport.serializeUser(function(user, cb) {
process.nextTick(function() {
cb(null, { id: user.id, username: user.username });
});
});
passport.deserializeUser(function(user, cb) {
process.nextTick(function() {
return cb(null, user);
});
});
기본적으로 serializer를 사용하여 세션에 user-id를 저장하고 사용자 모델 인스턴스가 필요할 때 해당 user-id를 사용하여 deserializer를 사용하여 데이터베이스를 검색합니다.
세션이 활성화되고 사용자가 인증되는 한,
req.session.passport.user
항상 사용자 모델 인스턴스에 해당합니다.
사용자 ID를 세션에 저장하지 않고 리디렉션이 있으면 사용자 인증 여부를 알 수 없습니다.
사용자가 인증되면req.session.passport.user
이 설정되므로 이후의 모든 요청은 사용자가 인증되었음을 알 수 있습니다.
이것이 단순화되기를 바랍니다.
Passport의 직렬화 및 역직렬화 방법에 대한 시각적 워크플로우:
- 사용자가 응용 프로그램에 로그인하고 자격 증명을 제공합니다.
- 여권은 일련 번호를 사용합니다.사용자 개체를 가져와 세션 개체로 변환하는 사용자 기능입니다.
- Passport는 세션 객체를 서버에 저장하고 세션 쿠키를 사용자의 브라우저로 전송합니다. 4.사용자가 애플리케이션에 요청합니다. 5.여권은 역직렬화를 사용합니다.세션 개체를 가져와 사용자 개체로 다시 변환하는 사용자 기능입니다.
- 여권은 사용자 개체를 응용프로그램으로 전달하고, 응용프로그램은 이 개체를 사용하여 사용자가 인증되었는지 여부를 확인할 수 있습니다.
- 사용자가 인증되면 응용 프로그램에서 요청된 리소스에 액세스할 수 있습니다.
- 사용자가 인증되지 않은 경우 응용 프로그램이 액세스를 거부하고 로그인 페이지로 리디렉션합니다.
다음은 워크플로우를 시각적으로 표현한 것은 다음과 같습니다.
+------------+ +---------------+
| | | |
| User Login | | Session Object |
| | serializeUser | |
+-----+------+ ------------------> +---------+
| | |
| | Store on |
| | Server |
| | |
+-----+------+ <------------------ +---------+
| | | |
| User Request | deserializeUser | |
| | ------------------> | |
+------------+ | +-----------+
| |
| |
| |
+-----+------+ <------------------ +---------+
| | | |
| Authenticated | | User |
| or not | | |
| | | |
+------------+ +---------------+
이것이 패스포트의 직렬화 및 역직렬화 방법의 작업 흐름을 명확히 하는 데 도움이 되길 바랍니다!
언급URL : https://stackoverflow.com/questions/27637609/understanding-passport-serialize-deserialize
'code' 카테고리의 다른 글
사용자 존재 여부 확인 (0) | 2023.05.13 |
---|---|
코드 검토 후 꺼내기 요청 업데이트를 위한 기본 Github 워크플로우 (0) | 2023.05.13 |
bash 스크립트에서 여러 프로그램을 병렬로 실행하려면 어떻게 해야 합니까? (0) | 2023.05.13 |
패키지의 각 종속성을 업데이트하는 방법.최신 버전의 json? (0) | 2023.05.13 |
노드의 fs.mkdirSync로 전체 경로를 만드는 방법은 무엇입니까? (0) | 2023.05.13 |