바닐라 JavaScript (ES6)를 사용한 단순 기본 인증
app.use((req, res, next) => {
// -----------------------------------------------------------------------
// authentication middleware
const auth = {login: 'yourlogin', password: 'yourpassword'} // change this
// parse login and password from headers
const b64auth = (req.headers.authorization || '').split(' ')[1] || ''
const [login, password] = Buffer.from(b64auth, 'base64').toString().split(':')
// Verify login and password are set and correct
if (login && password && login === auth.login && password === auth.password) {
// Access granted...
return next()
}
// Access denied...
res.set('WWW-Authenticate', 'Basic realm="401"') // change this
res.status(401).send('Authentication required.') // custom message
// -----------------------------------------------------------------------
})
참고 :이 "미들웨어"는 모든 핸들러에서 사용할 수 있습니다. next()
논리를 제거 하고 반전하십시오. 아래의 1 개 문 예 또는 이 답변 의 편집 내역 을 참조하십시오.
왜?
req.headers.authorization
" Basic <base64 string>
" 값을 포함 하지만 비어있을 수도 있으며 실패하지 않기를 원하므로|| ''
- 노드는 알 수 없습니다
atob()
및 btoa()
따라서,Buffer
ES6-> ES5
const
그냥 var
.. 일종의
(x, y) => {...}
그냥 하나에 function(x, y) {...}
const [login, password] = ...split()
두 개의 var
할당입니다
영감의 원천 (패키지 사용)
위는
매우 짧고 플레이 그라운드 서버에 빠르게 배포 할 수 있도록 고안된
매우 간단한 예제입니다 . 그러나 주석에서 지적했듯이 암호에는 콜론 문자도 포함될 수 있습니다 .
b64auth 에서 올바르게 추출하려면 이것을 사용할 수 있습니다.
:
// parse login and password from headers
const b64auth = (req.headers.authorization || '').split(' ')[1] || ''
const strauth = Buffer.from(b64auth, 'base64').toString()
const splitIndex = strauth.indexOf(':')
const login = strauth.substring(0, splitIndex)
const password = strauth.substring(splitIndex + 1)
// using shorter regex by @adabru
// const [_, login, password] = strauth.match(/(.*?):(.*)/) || []
하나의 문에서 기본 인증
... 반면에 로그인을 한 번만 사용하거나 거의 사용 하지 않는 경우 필요한 최소한의 사항입니다. (인증 정보를 전혀 구문 분석 할 필요도 없습니다)
function (req, res) {
//btoa('yourlogin:yourpassword') -> "eW91cmxvZ2luOnlvdXJwYXNzd29yZA=="
//btoa('otherlogin:otherpassword') -> "b3RoZXJsb2dpbjpvdGhlcnBhc3N3b3Jk"
// Verify credentials
if ( req.headers.authorization !== 'Basic eW91cmxvZ2luOnlvdXJwYXNzd29yZA=='
&& req.headers.authorization !== 'Basic b3RoZXJsb2dpbjpvdGhlcnBhc3N3b3Jk')
return res.status(401).send('Authentication required.') // Access denied.
// Access granted...
res.send('hello world')
// or call next() if you use it as middleware (as snippet #1)
}
추신 : "보안"경로와 "공개"경로가 모두 필요합니까? express.router
대신 사용 을 고려하십시오 .
var securedRoutes = require('express').Router()
securedRoutes.use(/* auth-middleware from above */)
securedRoutes.get('path1', /* ... */)
app.use('/secure', securedRoutes)
app.get('public', /* ... */)
// example.com/public // no-auth
// example.com/secure/path1 // requires auth