어서 오세요. 여권과 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, 평화롭다!

    좋은 웹페이지 즐겨찾기