이상한 문제가 있습니다. 사용자를위한 이메일 확인을 위해 json 웹 토큰을 사용하여 NodeJS/Express api를 작성합니다. 사용자 등록 및 전자 메일 확인 경로 모두에 대한 코드는 다음과 같습니다. 다음 절차를 사용하여 Postman에서 이러한 경로를 테스트 할 때 모든 것이 잘됩니다 (상태 200, 사용자 객체 반환). 1. 사용자 생성을 위해 POST 요청을 보냅니다. 2. mongodb 쉘을 사용하여 새 사용자로부터 토큰을 가져옵니다. 3. 확인 경로로 요청을받을 때 copy/pasted token을 사용하십시오.노드/익스프레스 API, JWT 토큰을 사용한 전자 메일 확인, 예기치 않은 동작
그러나 실제로 이메일로 전송 된 링크를 클릭하면 DB에서 모든 내용이 업데이트되지만 401 오류가 발생합니다. 전자 메일의 링크에서 토큰을 복사하여 붙여 넣기하여 우편 발송자에게 보내는 경우에도 동일한 결과가 나타납니다.
경로 :
app.post('/api/users', (req, res) => {
let body = _.pick(req.body, [
'email', 'password', 'firstName', 'lastName', 'adminRequested'
]);
let user = new User(body);
user.save().then(() => {
return user.generateAuthToken('confirmation', '1h');
}).then((token) => {
let currentUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
let confirmationUrl = currentUrl + `/confirm/${token}`;
mailTransport.sendMail({
from: `Break Board API <${process.env.MAIL_USER}>`,
to: user.email,
subject: 'Your Email Confirmation Link',
text: `Click this link to verify your email: ${confirmationUrl}`
});
res.send(JSON.stringify(user, undefined, 2));
}).catch((e) => {
res.status(400).send(e);
});
});
app.get('/api/users/confirm/:token', confirmToken, (req, res) => {
let token = req.token;
let user = req.user;
req.user.update({
$set: {
emailConfirmed: true
},
$pull: {
tokens: {token}
}
}).then(() => {
res.send(user);
});
});
confirmToken 미들웨어 :
let {User} = require('./../models/user');
let confirmToken = (req, res, next) => {
let token = req.params.token;
User.findByToken(token).then((user) => {
if(!user) {
return Promise.reject();
}
req.user = user;
req.token = token;
next();
}).catch((e) => {
res.status(401).send();
});
};
중간 도자기는 res.status (401)가 전체 코드에서 유일하게, 그래서 내가 아는 그것이 어디에서 오는지는 알 수 있지만 전자 메일의 토큰을 사용할 때만 발생하는 이유를 이해할 수 없거나 모든 DB 작업이 실제로 401이면 성공합니다. O가 수정 된 Postman에서 401 오류가 발생하면 r 존재하지 않는 JWT 토큰을 사용하면 DB 작업이 수행되지 않습니다.
아이디어가 있으십니까?
많은 시행 착오를 통해 어떤 일이 일어나고 있는지 알았지 만 해결 방법을 아직 모르고 있습니다. 기본적으로 이메일을 열 때마다 링크를 클릭하기 전에 링크의 유효성을 검사합니다. 링크를 클릭하면 모든 것이 업데이트되고 토큰이 제거됩니다. – TylerB