NodeJs - JWT 토큰에서 사용자 정보를 검색하시겠습니까?
노드 및 각도.MEAN 스택 인증 어플리케이션을 사용하고 있습니다.이 어플리케이션에서는 로그인에 성공했을 때 다음과 같이 JWT 토큰을 설정하고 이를 컨트롤러 내의 세션에 저장합니다.설정에 JWT 토큰 할당서비스 인터셉터를 통한 헤더:
var token = jwt.sign({id: user._id}, secret.secretToken, { expiresIn: tokenManager.TOKEN_EXPIRATION_SEC });
return res.json({token:token});
authservice.js Interceptor( 생략된 requestError, response 및 responseError):
authServices.factory('TokenInterceptor', ['$q', '$window', '$location','AuthenticationService',function ($q, $window, $location, AuthenticationService) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
return config;
}
};
}]);
토큰에서 로그인 사용자 세부 정보를 가져오려고 합니다. 어떻게 하면 될까요?나는 다음과 같이 시도했지만, 작동하지 않았다.Users.js 파일에서 오류를 기록하면 "ReferenceError: headers is not defined"라고 표시됩니다.
authController.js:
$scope.me = function() {
UserService.me(function(res) {
$scope.myDetails = res;
}, function() {
console.log('Failed to fetch details');
$rootScope.error = 'Failed to fetch details';
})
};
auth Service.js:
authServices.factory('UserService',['$http', function($http) {
return {
me:function() {
return $http.get(options.api.base_url + '/me');
}
}
}]);
Users.js(노드):
exports.me = function(req,res){
if (req.headers && req.headers.authorization) {
var authorization =req.headers.authorization;
var part = authorization.split(' ');
//logic here to retrieve the user from database
}
return res.send(200);
}
사용자 세부 정보를 검색하려면 토큰을 매개 변수로 전달해야 합니까?또는 사용자 세부사항도 별도의 세션 변수에 저장하시겠습니까?
우선, 사용자 승인 처리에는 Passport 미들웨어를 사용하는 것이 좋습니다.요청을 구문 분석하는 모든 더러운 작업을 수행하며 많은 인증 옵션도 제공합니다.이제 Node.js 코드를 입력하겠습니다.jwt 메서드를 사용하여 전달된 토큰을 확인하고 해석한 후 토큰에서 추출된ID로 사용자를 찾아야 합니다.
exports.me = function(req,res){
if (req.headers && req.headers.authorization) {
var authorization = req.headers.authorization.split(' ')[1],
decoded;
try {
decoded = jwt.verify(authorization, secret.secretToken);
} catch (e) {
return res.status(401).send('unauthorized');
}
var userId = decoded.id;
// Fetch the user by id
User.findOne({_id: userId}).then(function(user){
// Do something with the user
return res.send(200);
});
}
return res.send(500);
}
요청 데이터에서 토큰 찾기:
const usertoken = req.headers.authorization;
const token = usertoken.split(' ');
const decoded = jwt.verify(token[1], 'secret-key');
console.log(decoded);
함수를 호출하고 있습니다.UserService.me
이 함수는 인수를 받지 않지만 2개의 콜백을 사용합니다.네가 하고 싶은 건
$scope.me = function() {
UserService.me().then(function(res) {
$scope.myDetails = res;
}, function() {
console.log('Failed to fetch details');
$rootScope.error = 'Failed to fetch details';
});
};
또한 $http 메서드는 응답 개체를 반환합니다.원하는 것이 다음 중 하나가 아님을 확인합니다.$scope.myDetails = res.data
Users.js 파일에서는 변수를 사용하고 있습니다.headers.authorization
직접적이어야 하는 반면req.header.authorization
:
var authorization = req.headers.authorization;
매뉴얼 https://github.com/themikenicholson/passport-jwt,에 따르면request.user
주의하세요, 저는 당신이 passport-jwt와 함께 여권을 사용하고 있다고 가정합니다.인증 컨텍스트에서 패스포트가 요청 개체를 설정하고 사용자 속성을 채우는 것이기 때문에 가능합니다.그러니 그 사유지에 접속해미들웨어를 할 필요는 없어요.
앤더슨 안질레이로 말이 맞아요미들웨어 코드로 완전한 토큰을 반환하면 요청에 사용자 속성이 입력되어 프로파일에 액세스할 수 있습니다.
passport.use(
new JWTstrategy(
{
secretOrKey: process.env.ACCESS_TOKEN_SECRET,
// jwtFromRequest: ExtractJWT.fromUrlQueryParameter('secret_token')
jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken()
},
async (token, done) => {
try {
return done(null, token);
} catch (error) {
done(error);
}
}
)
);
req.user는 다음을 반환합니다.
{
"user": {
"username": "admin"
},
"iat": 1625920948,
"exp": 1626007348
}
언급URL : https://stackoverflow.com/questions/33451298/nodejs-retrieve-user-information-from-jwt-token
'programing' 카테고리의 다른 글
다른 구성 요소 경고를 렌더링하는 동안 구성 요소를 업데이트할 수 없습니다. (0) | 2023.03.18 |
---|---|
Angularjs의 templateUrl을 사용하여 템플릿을 로드할 수 없습니다. (0) | 2023.03.18 |
스프링 부트 액추에이터(스프링 액추에이터 (0) | 2023.03.18 |
JPA를 사용하여 LocalDate를 유지하는 방법 (0) | 2023.03.18 |
ESLint - 구성 요소를 순수한 기능으로 작성해야 합니다(반응 선호/상태 없음 기능). (0) | 2023.03.18 |