서버 없는 과정 - 제2과: AWS 인증 구축 방법
11468 단어 serverlessawswebdevbeginners
https://www.blog.duomly.com/lesson-2-serverless-authentication/
서버 인증 프로필 없음
오늘 수업에서는 서버 인증이 없는 것을 배울 것입니다.
'무서버가 뭐예요'이번 회 다 봤어요?
없으면, 여기에서 찾을 수 있습니다.
What is serverless
다음은 서버 없는 과정의 첫 번째 과목인 서버 없는 방법을 배워야 합니다.
너는 여기서 그것을 찾을 수 있다.
Lesson 1: Serverless how to get started tutorial for beginners
만약 네가 이전에 이미 완성했다면, 너는 오늘의 수업에 전념하여 새로운 기본 기능을 배울 수 있다.
서버 인증이 없는 기능과 필요한 모든 기능을 구축하기 위해 더 많은 인코딩을 할 것입니다.
MongoDB 모델을 구축하는 방법, 서버리스에 등록하는 방법, MongoDB에 로그인하는 방법, 그리고 서버리스에서 JWT 영패를 검증하는 방법을 배울 것입니다.
우리 시작합시다!
만약 당신이 동영상을 좋아한다면, 여기서 유튜브 버전을 찾을 수 있습니다.
Serverless에서 MongoDB 연결 설정 방법
우리가 먼저 해야 할 일은 데이터베이스 연결 설정이다.
이를 위해, "database"라는 파일을 만들어야 합니다.js', 데이터베이스 연결을 담당하는 논리를 포함하는'db'라는 모듈을 만듭니다.
const mongoose = require('mongoose');
let connection;
module.exports = db = () => {
if(connection) {
return Promise.resolve();
}
return mongoose.connect(process.env.DB)
.then(database=>{
connection = database.connections[0].readyState;
});
}
verify jwt를 서버less에 추가합니다.yml 회사
다음 단계에서 우리는 오늘의 논리를 위해 함수를 만들고 프로세서와 API 경로를 지정할 것이다.
서버 없음으로 이동합니다.yml,'검증 jwt'라는 함수를 만들고 처리 프로그램의 파일에 경로를 전달합니다.
functions:
verify-jwt:
handler: authentication/VerifyJWT.verify
서버 없음에 로그인을 추가합니다.yml 회사
다음은 "login"이라는 함수를 만들어야 합니다.
노드에 경로를 전달합니다.js 모듈과 post 방법을 사용하여 HTTP 노드로 설정합니다.
API 경로를 인증/로그인으로 설정합니다.
login:
handler: authentication/AuthenticationHandler.login
events:
- http:
path: auth/login
method: post
cors: true
레지스터를 서버가 없는 곳에 추가합니다.yml 회사
로그인과 유사하게 "register"라는 함수를 만들어야 합니다.
register:
handler: authentication/AuthenticationHandler.register
events:
- http:
path: auth/register
method: post
cors: true
서버가 없는 서버에 myProfile을 추가합니다.yml 회사
마지막 단계는 서버가 없습니다.yml은 "myProfile"이라는 함수여야 합니다.
두 가지 다른 점이 있을 것이다.
우선 API 방법이 제공되고 있습니다.
두 번째는'검증 jwt'를 권한 수여자로 사용해야 한다는 것이다.
myProfile:
handler: user/UserHandler.myProfile
events:
- http:
path: user/myprofile
method: get
cors: true
authorizer: verify-jwt
MongoDB 모델 생성 방법
우리 서버가 없습니다. 축하합니다!
지금 우리는 사용자에게 들어갈 수 있다.js, 그리고 그곳에서 MongoDB 모델을 만듭니다.
우리의 사용자 모델은 몇 개의 필드를 포함해야 한다.
첫 번째는 이름을 문자열로, 전자메일을 문자열로, 암호를 문자열로, 고급을 부울 값으로, 고급을 날짜로 해야 한다.
모든 모드를 User로 명명하고 mongose 모듈로 내보냅니다.
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
name: String,
email: String,
password: String,
premium: Boolean,
premiumEnds: Date,
});
mongoose.model('User', UserSchema);
module.exports = mongoose.model('User');
authenticationHandler 만들기
이 단계에서, 우리는 "authentication"이라는 디렉터리를 만들고, "Authentication Handler"라는 파일을 만들 수 있습니다.안에 있어요.
authenticationHelpers 만들기
이전과 유사하게 "AuthenticationHelpers"라는 파일을 만들면 됩니다.js“
authenticationHelpers에서 signJWT 만들기
이제 우리는 더 많은 코드를 작성하기 시작할 수 있다.
AuthenticationHelpers로 들어가겠습니다.js, 그리고'signJWT'라는 내보내기 모듈을 만듭니다.
모듈에서 jwt 기호를 되돌려주고 영패에서 id를 전달합니다.
module.exports.signJWT = (id) => {
return jwt.sign({ id: id }, process.env.JWT_SECRET, {expiresIn: 604800});
}
authenticationHelpers에서 등록 인증 만들기
다음 단계에서, 우리는 다음 모듈을 만들어야 한다.
이 항목은 "valid Registration"이라고 명명해야 합니다. 이 항목에 포함된 논리는 우리의 통화 본문에 필요한 모든 데이터를 포함할 수 있도록 합니다.
이 경우 암호가 있고 길이가 6자 이상인지 확인해야 합니다.
우리는 이메일이 있는지 확인해야 한다.만약 무엇이 부족하다면, 우리는 반드시 약속에 보답해야 한다.메시지로 거절하다.
module.exports.validRegistration = (body) => {
if (!body.password || body.password.length <= 6) {
return Promise.reject(new Error('Password need to be at least 7 characters.'));
}
if (!body.email) {
return Promise.reject(new Error('Email is required'));
}
return Promise.resolve();
}
어떻게 노드에서 비밀번호를 비교합니까?회사 명
이제 다음 모듈을 만들어야 합니다. 이 모듈은'verify Password'인증 과정에서 매우 중요합니다.
함수 내부에서 우리는 두 개의 암호, API가 보낸 암호와 데이터베이스의 실제 암호를 비교해야 한다.
이를 위해, 우리는 "bcrypt"방법을 사용해야 한다.비교하여 약속에 보답하다.암호가 올바르지 않으면 거부합니다.
module.exports.verifyPassword = (sentPassword, realPassword, userId) => {
return bcrypt.compare(sentPassword, realPassword)
.then(valid => !valid ? Promise.reject(new Error('Incorrect password.')) : this.signJWT(userId)
);
}
authenticationHandler에서 등록 함수와 조수 만들기
AuthenticationHandler에 들어가야 합니다.js 파일을 만들고 내보내기 모듈 "register"를 만듭니다.
이 모듈은 두 개의 매개 변수를 사용해야 한다. 첫 번째는'r'를 요청으로 하고, 두 번째는'cb'를 리셋으로 해야 한다.
첫 번째 단계에서, 우리는 반드시 리셋을 설정해야 하는데, 실제로는 "cb"이다.callbackhaitsforemptyeventloop"은false입니다. 리셋 트리거할 때 응답을 보냅니다.
이제 우리는 DB 연결과 일부 연결을 되돌려야 한다.
첫 번째는 해석된 주체를register 함수에 전달하고, 두 번째는 응답을 만들고, 마지막은 오류를 처리해야 한다.
다음으로, 우리는 함수 "register"를 만들고, "body"를 매개 변수로 삼아야 합니다.
레지스터에서, 우리는 "validRegistration"기능을 통해 입력을 유효하게 해야 한다.
다음으로, 우리는 사용자가 존재하지 않는지 확인해야 한다.만약 그것이 존재한다면, 우리는 잘못된 메시지를 되돌려야 한다.만약 없다면, 우리는 암호를 암호화하고 사용자를 만들어야 한다.
마지막 단계에서, 우리는 서명한 JWT를 사용자에게 돌려주어야 한다.
module.exports.register = (r, cb) => {
cb.callbackWaitsForEmptyEventLoop = false;
return db()
.then(() => register(JSON.parse(r.body)))
.then(res => success(res))
.catch(err => errResponse(err));
};
function register(body) {
return validRegistration(body)
.then(() => User.findOne({ email: body.email }))
.then(exists => exists ? Promise.reject(new Error('User exists')) : bcrypt.hash(body.password, 8))
.then(hashedPass => User.create({ name: body.name, email: body.email, password: hashedPass, premium: false}))
.then(user => ({ auth: true, token: signJWT(user._id) }));
}
authenticationHandler에서 로그인 함수와 조수 만들기
로그인 모듈은 거의 레지스터와 같아 보이지만, "register"를 "login"으로 변경합니다.
하지만 로그인 도우미의 기능은 조금 다르다.
우선, 우리는 사용자가 적어도 존재하는지 확인해야 한다.만약 없다면, 우리는 잘못된 메시지를 되돌려야 한다.
만약 그것이 존재한다면, 우리는verifyPassword 함수를 호출하고, 모든 정상적인 상황에서signedJWT로 돌아가야 한다.
module.exports.login = (r, cb) => {
cb.callbackWaitsForEmptyEventLoop = false;
return db()
.then(() => login(JSON.parse(r.body)))
.then(res => success(res))
.catch(err => errResponse(err));
};
function login(body) {
return User.findOne({ email: body.email })
.then(user => !user ? Promise.reject(new Error('Incorrect password or username')) : comparePassword(body.password, user.password, user._id))
.then(signedJWT => ({ auth: true, token: signedJWT }));
}
VerifyJWT 함수 만들기(aws 권한 부여자)
지금 우리는 VerifyJWT에 들어갈 수 있다.js 파일, JWT 영패에 중점을 둡니다.
첫 번째 단계로, 우리는 검증이라는 내보내기 모듈을 만들어야 한다.
이 모듈은 jwt를 사용해야 합니다.인증 함수, 영패가 권한을 부여받지 않으면 오류를 되돌려줍니다.
권한이 부여되면 AWS 보안 정책을 생성해야 합니다. 이 정책은 리셋으로 돌아옵니다.
복귀 전략의 가능성을 위해서 우리는 먼저 그것을 생성해야 한다.
이를 위해,principalId,effect,resource를 매개 변수로 하는 함수 "generatePolicy"를 만들어야 합니다.
다음은 영향과 자원이 있는지 검증해야 한다.
그렇다면 API에 액세스할 수 있는 정책을 사용하여 객체를 작성할 수 있습니다.
정책에 관심이 있다면 AWS 인증 문서에서 보안 정책에 대한 설명을 찾을 수 있습니다.
const jwt = require('jsonwebtoken');
module.exports.verify = (r, context, cb) => {
const token = r.authorizationToken;
if(token) {
jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
if (err)
return cb(null, 'JWT not authorized');
return cb(null, generatePolicy(decoded.id, 'Allow', r.methodArn))
});
} else {
return cb(null, 'JWT not authorized');
}
};
const generatePolicy = (principalId, effect, resource) => {
const res = {};
res.principalId = principalId;
if (effect && resource) {
const policyDocument = {
Version: "2012-10-17",
Statement: [
{
Action: "execute-api:Invoke",
Effect: effect,
Resource: resource
}
]
};
res.policyDocument = policyDocument;
}
return res;
}
userHandler에서 myProfile 함수 및 helper 만들기
첫 번째 단계로 "user"디렉터리에 들어가서 "UserHandler.js"파일을 만들어야 합니다.
다음은 이 파일을 열고 내보내는 모듈 "myProfile"을 만들어야 합니다.
AuthenticationHandler의 로그인 또는 등록 함수 처리 프로그램과 같아야 합니다.js, 하지만 "myProfile"이지 "register"나 "login"이 아닙니다.
다음은 간단한 함수 "myProfile"을 만듭니다. 이 함수는 모델에서byid를 찾아서 되돌려줍니다.
const User = require('./User');
const { success, errResponse } = require('../authentication/AuthenticationHelpers');
module.exports.myProfile = (r, cb) => {
cb.callbackWaitsForEmptyEventLoop = false;
return db()
.then(() => myProfile(r.requestContext.authorizer.principalId))
.then(res => success(res))
.catch(err => errResponse(err));
};
function myProfile(id) {
return User.findById(id)
.then(user => !user ? Promise.reject('User not found.') : user)
.catch(err => Promise.reject(new Error(err)));
}
테스트 응용 프로그램(인권: 영패)
우후, 당신의 신분 검증이 준비되었습니다!
우선, 오프라인으로 프로그램을 시작해야 합니다.
이렇게 하려면 터미널을 열고 다음을 입력합니다.
sls offline start —skipCacheInvalidation
다음에postman을 열고 API를 호출할 수 있습니다.첫 번째 통화로 POST에 데이터를 보내 사용자를 등록해야 합니다.
http://localhost:3000/dev/auth/register
이제 GET 방법을 사용하여 개인 정보를 얻을 수 있습니다.이를 위해서는 등록이 되돌아오는 영패를 가져와 권한 부여 제목에 추가하고 이 단점을 호출해야 합니다.
http://localhost:3000/dev/myprofile
사용자가 프로필을 응답으로 삼아야 합니다.서버 인증 없음 결론
축하드립니다. Node를 사용하여 서버 인증이 없습니다.js.
오늘 너는 많은 것을 배웠다.
완전히 작동하는 RESTAPI를 구축하여 MongoDB 데이터베이스에 연결하고 DB에서 첫 번째 사용자를 만들었으며 심지어 AWS 보안 정책을 구축했습니다.
다음은 오늘 회 코드입니다.
https://github.com/Duomly/aws-serverlesss-nodejs/tree/serverless-course-lesson-2
나는 지체없이 너를 다음 과목에 가입시켜 다음 과목의 주문서를 작성하는 방법을 가르쳐 주고 싶다.
우리는 주문서 작성, 주문 편집, 상태 업데이트, 삭제, 그리고 각각의 적절한 SaaS 응용 프로그램에 무엇을 포함해야 하는지 배울 것입니다.
읽어주셔서 감사합니다.
Duomly의 Radek.
Reference
이 문제에 관하여(서버 없는 과정 - 제2과: AWS 인증 구축 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/duomly/serverless-course-lesson-2-how-to-build-aws-authentication-2bbn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)