어서 오세요. 여권과 JWTicket을 보여 주세요!
식별 또는 인증 과정은 모든 응용 프로그램의 핵심으로 이 단계의 안전성은 매우 중요하다.그러나 우리가 오늘 여기서 말하고자 하는 것은 신분을 창조하는 과정이 더 이상 번거롭지 않다는 것이다.
인터넷을 하나의 대륙으로 상상하면 그곳에서는 응용 프로그램과 서브네트워크가 마치 접촉하는 나라, 때로는 중첩된 나라와 같다.신분을 한 곳에서 다른 곳으로 옮길 수 있다면 좋지 않겠습니까?그래서 여권이 필요해.js.
그들의 주요 업무website에서
Passport is authentication middleware for Node.js. Extremely flexible and modular, Passport can be unobtrusively dropped in to any Express-based web application.
이 패키지에는 거의 모든 요구 사항을 충족하는 500가지 이상의 인증 정책이 포함되어 있습니다.사용자가 구글, 페이스북, 또는 다른 플랫폼에서 왔든지 간에, 양식을 다시 작성하지 않고 인터넷에 쉽게 접속할 수 있도록 전략을 실시할 수 있다.
작업 프로세스는 일반적으로 두 단계로 나뉜다. (1) 정책을 정의하고, (2) 방안에 놓는다.이를 위해 다음과 같은 기능을 사용할 수 있습니다.
passport.use(
// Configure an Authentication Strategy
)
passport.initialize() // Initialize the Strategy
passport.authenticate(
// Handle the Authentication Request
)
우리는 아래의 업무 예시에서 어떻게 이런 것들을 사용하는지 상세하게 소개할 것이다.앞서 인증 미디어에 대한 우리의 선택은 JWT 또는 JSON 웹 토큰이라는 흥미로운 기술에 달려 있다고 지적했습니다.더욱 고전적인 신분 데이터 저장 방식에 비해 JWT는 더욱 복잡한 방안에 사용할 수 있을 뿐만 아니라 유연한 안전성을 제공한다.만약 당신이 JWT를 들어본 적이 없다면,
JWT, is an open standard used to share security information between two parties — a client and a server. Each JWT contains encoded JSON objects, including a set of claims. JWTs are signed using a cryptographic algorithm to ensure that the claims cannot be altered after the token is issued.
JWT는 점(.)으로 구분되는 세 부분으로 구성된 문자열입니다.베이스64를 사용하여 서열화합니다.JWT는 이렇게 보입니다:
xxxxx.yyyyy.zzzzz
.일단 디코딩을 하면, 두 개의 JSON 문자열, 헤더 + 유효 하중, 서명을 줄 것입니다.헤더가 영패의 유형과 서명 알고리즘을 표시합니다.유효 하중에는 기술적으로 선택할 수 있는 성명이 포함되어 있지만, 일부 필드는 일부 표준에 필수적이다.마지막으로 서명은 산열로 유효 부하의 완전성을 검사하고 잠재적인 변화를 방지하는 데 도움을 줍니다.
종합적으로 말하면 JWT는 같은 실체의 크로스플랫폼 입장권으로서 물론 대사관에서 서명해야 한다!
이제 신청할 때가 됐어.우리는 구글OAuth2 방안을 사용하는 가장 간단한 작업 코드를 구축할 것이다.요컨대, 그것은 두 가지 영패를 사용하는 기술, 즉 방문 영패와 갱신 영패이다.첫 번째는 액세스에 사용되고 단기적이며, 두 번째는 첫 번째 만료 시 액세스를 갱신하는 데 사용됩니다.
당신은 전체 방안의 가장 중요한 부분인 영패를 갱신하거나 RT를 갱신하는 것을 기억해야 합니다.
쓸데없는 말 그만하고 우리 코드를 이야기하기 시작합시다.
여권 옆.js 다음 패키지express를 사용할 것입니다.족제비다.js와 jsonwebtoken.js와passport-google-oauth2.반드시 그것들을 잘 설치해야 한다.
Google은 OAuth2를 사용하여 구글을 통해 인증을 실현하는 루트를 포함하는 간단한express 프로그램을 구축할 것입니다.기호화폐는 당연히 JWT다.몬고우스를 설정하는 방법을 알고 있다고 가정합니다. 왜냐하면 우리는 그것을 사용하여 사용자와 관련된 한 쌍의 영패를 저장할 것입니다.
작업 개요는 다음과 같습니다.
1. 토큰 모드
/* filename: ***tokenSchema.js*** */
const jwt = require("jsonwebtoken")
const mongoose = require("mongoose")
// The Schema
const jwtSchema = new mongoose.Schema({
userId: { type: mongoose.Schema.Types.ObjectId, ref: "users" },
Token: { type: String },
expAt: Date,
});
// Token Creation
jwtSchema.statics.CreateToken = async function (_id) {
let expiredAt = new Date()
expiredAt.setSeconds(expiredAt.getSeconds() + 60);
let _token = jwt.sign({ id: _id }, JWTREFRESHTOKENSECRET);
let _object = new this({
userId: _id,
Token: _token,
expAt: expiredAt.getTime(),
})
let refreshToken = await _object.save()
return refreshToken
}
// Token Verification
jwtSchema.statics.VerifyToken = async function (token) {
return (await token.expAt.getTime()) < new Date().getTime();
};
const RefreshToken = mongoose.model("JwtCollection", jwtSchema);
module.exports = { RefreshToken };
2. RT 중간부품
/* Refresh Token */
const jwt = require("jsonwebtoken");
const RefreshToken = require(/* path to tokenSchema.js */);
const RTMiddleware = async (req, res, next) => {
const { refreshToken: requestToken } = req.body
if (requestToken == null) {
return res.status(403).json({ message: "Refresh Token is required!" })
}
try {
let refreshToken = await RefreshToken.findOne({ Token: requestToken });
console.log(refreshToken)
if (!refreshToken) {
res.status(403).json({ message: "Refresh Token is not in database!" });
return;
}
const isValid = await RefreshToken.VerifyToken(refreshToken)
if (isValid) {
RefreshToken.findByIdAndRemove(refreshToken._id, {
useFindAndModify: false,
}).exec()
res.status(403).json({
message: "Refresh Token expired. Please make a new sign-in request!",
})
return;
}
let newAccessToken = jwt.sign(
{ id: refreshToken.userId },
JWTSECRET,
{
expiresIn: JWT_ACC_EXP_TIME,
}
)
return res.status(200).json({
accessToken: newAccessToken,
refreshToken: refreshToken.Token,
})
} catch (err) {
return res.status(500).send({ message: err })
}
}
module.exports = { RTMiddleware }
3. 전략 정의
/* filename: authentication.js */
const passport = require("passport")
/*
It is assumed that you have a userSchema.js file with the following fields:
name, email, password, verified and picture.
*/
const userModel = require(/* path to the userSchema.js */)
passport.use(
new GoogleStrategy(
{
clientID: CLIENTID,
clientSecret: SECRETID,
callbackURL: "http://localhost:5000/auth/google/redirect",
},
async (accessToken, refreshToken, profile, done) => {
// Deconstruct the data
const { email, name, email_verified, picture } = profile._json
// Verify if user exists
const userExists = await userModel.findOne({ email })
// True: redirect user
if (userExists) {
return done(null, User)
}
// False: create new user, then redirect
const newUser = await UserModel.create({
email,
name,
verified: email_verified,
picture,
});
done(null, newUser)
}
)
)
4. 노선 정의
/* filename: ***index.js*** */
const express = require("express")
const jwt = require("jsonwebtoken")
const passport = require(/* path to authentication.js */)
const { RefreshToken } = require(/* pathe to tokenSchema.js */);
const App = express()
App.get(
"/auth/google",
passport.authenticate("google", { scope: ["email", "profile"] })
);
App.get(
"/auth/google/redirect",
passport.authenticate("google", { failureRedirect: "/", session: false }),
async (req, res) => {
const { _id } = req.user;
try {
//AT = accses Token
//RT = refresh Token
const AT = jwt.sign({ id: _id }, JWTACSESSTOKENSECRET, {
ACSESSTOKENTIME,
});
const RT = await RefreshToken.CreateToken(_id);
res.status(200).json({ AT, RT });
} catch (error) {
res.status(500).json({ msg: "Something went wrong!" })
console.log(error);
}
}
)
// ... define other routes and start the server.
해석하다
구글 등록을 사용하려면 사용자가 위에서 설정한 노선
/auth/google
을 방문할 것입니다.완료되면 다음 페이지가 표시됩니다.passport 및 Google API 콘솔에서 구성
양식을 작성하고 다음을 클릭합니다.정책 규범에는 검증 과정이 상세하게 설명되어 있는데 이 과정은 사용자가 우리의 데이터베이스에 있는지 확인하고
authentication.js
에서 인코딩하는 작업을 수행한다.사용자가 있으면 로그인합니다.없으면 데이터베이스에 추가한 다음 Google 콘솔에서 지정한 리셋 URL로 리디렉션하여 JWT 프로세스를 시작합니다.
콜백 URL에서는 앞서 언급한 두 개의 토큰을 설계합니다.RT는 데이터베이스에 저장되며 AT와 RT는 클라이언트에 전송됩니다.
이 정책의 마지막 부분은 클라이언트가 개인 서비스나 자원을 방문하려고 시도할 때 요청에 영패가 추가되었는지 확인하고, 영패가 다운된 상태일 때 영패를 리셋합니다.RT가 만료되면 클라이언트가 다시 로그인해야 합니다.
다음은 전형적인 응답을 보실 수 있습니다. 우리는 호출
/auth/google
을 통해 리셋 URL을 통해의 데이터베이스 항목,
(1) 기호화폐
(2) 사용자
이것은 우리가 이 매우 풍부하고 없어서는 안 될 도구에 대한 간단한 논술을 끝냈다.전체 코드에 관심이 있을 수 있는 분들은 여기repo입니다.이러한 사용법은 API 액세스 또는 이와 유사한 상황까지 확장할 수 있습니다.
우리가 처음에 말한 바와 같이 이 방안에는 많은 전략이 있다.모든 문장은 자신의 특징을 가지고 있는데, 이 점은 한 문장에서 포괄할 수 없다.여기에 재미있는 심도 있는 안내서가 있습니다. 더 많은 것을 알고 싶으면 언제든지 보십시오.
여느 때와 같이, 이것은Codding Addicts, 평화롭다!
Reference
이 문제에 관하여(어서 오세요. 여권과 JWTicket을 보여 주세요!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/coddingaddicts/welcome-passport-and-jwticket-please-4mjd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)