2017-12-09 11 views
1

이상한 문제가 있습니다. 사용자를위한 이메일 확인을 위해 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 작업이 수행되지 않습니다.

아이디어가 있으십니까?

+0

많은 시행 착오를 통해 어떤 일이 일어나고 있는지 알았지 만 해결 방법을 아직 모르고 있습니다. 기본적으로 이메일을 열 때마다 링크를 클릭하기 전에 링크의 유효성을 검사합니다. 링크를 클릭하면 모든 것이 업데이트되고 토큰이 제거됩니다. – TylerB

답변

0

좋아, 피곤 해지면 구현으로 넘어 가서 실수로 해결책을 찾았습니다. 텍스트가 아닌 html로 전자 메일을 렌더링하도록 전환하면 전자 메일 클라이언트가 더 이상 토큰 링크를 따르지 않습니다.