Passport-http-bearer: ๋ฒ”์œ„๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2012๋…„ 03์›” 05์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jaredhanson/passport-http-bearer

์•ˆ๋…•ํ•˜์„ธ์š” Jared,

์—ฌ๊ถŒ์ด ์Šค์ฝ”ํ”„๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋จธ๋ฆฌ๋ฅผ ๊ฐ๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์Šต๋‹ˆ๋‹ค. ๋‚ด ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ† ํฐ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ ํ† ํฐ์—๋Š” ๋ฒ”์œ„๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž ๋ฒ”์œ„์˜ ํ† ํฐ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ ๊ฒฝ๋กœ์™€ ์ผ๋ฐ˜ ํ† ํฐ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์•ฑ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

app.use('/v1', ์—ฌ๊ถŒ.์ธ์ฆ('bearer', { ์„ธ์…˜: false }):

์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ํŠน์ • ๊ฒฝ๋กœ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฝ๋กœ์˜ ๋ฏธ๋“ค์›จ์–ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
.. ์—ฌ๊ถŒ.authenticate('bearer', { ์„ธ์…˜: false, ๋ฒ”์œ„: ['admin']})

์ด๊ฒƒ์€ ์—ฌ๊ถŒ์œผ๋กœ ์ง€์›๋ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅด๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@mwawrusch ๋‚˜๋Š” ๋งŒ์กฑํ•˜๊ณ  ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ์˜ ์•ฝ๊ฐ„ ์ •๋ฆฌ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

์ด์ œ ์„ฑ๊ณต์— ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” Passport์—์„œ req.authInfo ์— ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

passport.use(new BearerStrategy(
  function(token, done) {
    User.findOne({ token: token }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      return done(null, user, { scope: 'profile' });
    });
  }
));

๊ทธ๋Ÿฐ ๋‹ค์Œ info ์ธ์ˆ˜๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ฒด์ธ ์•„๋ž˜์˜ ๋ฏธ๋“ค์›จ์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

app.get('/api/userinfo', 
  passport.authenticate('bearer', { session: false }),
  function(req, res, next) {
    // access control middleware to check for required scope
    if (req.authInfo.scope != 'profile') {
      res.statusCode = 403;
      return res.end('Forbidden');
    }
    return next();
  }
  function(req, res) {
    res.json(req.user);
  });

info ๋Š” ์ผ๋ฐ˜ JSON ๊ฐœ์ฒด์ด๋ฏ€๋กœ ์•ฑ์€ ์ œ๊ณต๋œ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฒ”์šฉ ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ์—๋„ ์œ ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ์ด๋ฅผ ํ™œ์šฉํ•˜๋Š” OAuthorize ๋ฐ OAuth2orize ๊ฐœ๋ฐœ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. OAuth 1.0 ๋ฐ 2.0 ์„œ๋ฒ„๋ฅผ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋งŒ๋“  ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ Quora ํŽ˜์ด์ง€๋ฅผ ๋ณธ ๊ฒƒ ๊ฐ™์•„์š”. ์ด๊ฒƒ๋“ค์ด ์ถ”๊ฐ€๋˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์–ธ์ œ๋‚˜ ๊ทธ๋ ‡๋“ฏ์ด ํ”ผ๋“œ๋ฐฑ์„ ๋ณด๋‚ด์ฃผ์„ธ์š”. ๊ฑด๋ฐฐ!

๋ชจ๋“  3 ๋Œ“๊ธ€

์™„์„ฑ๋„๋ฅผ ์œ„ํ•ด ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฐœ์ฒด์— ๋ฒ”์œ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  req.user...๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜์ค‘์— ํŠน์ • ๊ฒฝ๋กœ์™€ ๋ฒ”์œ„๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

@mwawrusch ๋‚˜๋Š” ๋งŒ์กฑํ•˜๊ณ  ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ์˜ ์•ฝ๊ฐ„ ์ •๋ฆฌ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

์ด์ œ ์„ฑ๊ณต์— ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” Passport์—์„œ req.authInfo ์— ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

passport.use(new BearerStrategy(
  function(token, done) {
    User.findOne({ token: token }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      return done(null, user, { scope: 'profile' });
    });
  }
));

๊ทธ๋Ÿฐ ๋‹ค์Œ info ์ธ์ˆ˜๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ฒด์ธ ์•„๋ž˜์˜ ๋ฏธ๋“ค์›จ์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

app.get('/api/userinfo', 
  passport.authenticate('bearer', { session: false }),
  function(req, res, next) {
    // access control middleware to check for required scope
    if (req.authInfo.scope != 'profile') {
      res.statusCode = 403;
      return res.end('Forbidden');
    }
    return next();
  }
  function(req, res) {
    res.json(req.user);
  });

info ๋Š” ์ผ๋ฐ˜ JSON ๊ฐœ์ฒด์ด๋ฏ€๋กœ ์•ฑ์€ ์ œ๊ณต๋œ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฒ”์šฉ ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ์—๋„ ์œ ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ์ด๋ฅผ ํ™œ์šฉํ•˜๋Š” OAuthorize ๋ฐ OAuth2orize ๊ฐœ๋ฐœ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. OAuth 1.0 ๋ฐ 2.0 ์„œ๋ฒ„๋ฅผ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋งŒ๋“  ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ Quora ํŽ˜์ด์ง€๋ฅผ ๋ณธ ๊ฒƒ ๊ฐ™์•„์š”. ์ด๊ฒƒ๋“ค์ด ์ถ”๊ฐ€๋˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์–ธ์ œ๋‚˜ ๊ทธ๋ ‡๋“ฏ์ด ํ”ผ๋“œ๋ฐฑ์„ ๋ณด๋‚ด์ฃผ์„ธ์š”. ๊ฑด๋ฐฐ!

์•„์ฃผ ์ข‹์Šต๋‹ˆ๋‹ค ๊ฐ์‚ฌ ํ•ด์š”.

2012๋…„ 7์›” 13์ผ ๊ธˆ์š”์ผ ์˜ค์ „ 8์‹œ 36๋ถ„, Jared Hanson <
๋‹ต์žฅ@reply.github.com

์ผ๋‹ค:

@mwawrusch ๋‚˜๋Š” ๋งŒ์กฑํ•˜๊ณ  ์ผํ•˜๊ณ  ์žˆ๋Š” ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
๊ธ€์Ž„, ๋‹น์‹ ์ด ์–ธ๊ธ‰ ํ•œ ๊ฒƒ์˜ ์•ฝ๊ฐ„ ์ •๋ฆฌ ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

์ด์ œ ์„ฑ๊ณต์— ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
req.authInfo ์— ์—ฌ๊ถŒ

passport.use(new BearerStrategy(
  function(token, done) {
    User.findOne({ token: token }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      return done(null, user, { scope: 'profile' });
    });
  }
));

๊ทธ๋Ÿฐ ๋‹ค์Œ info ์ธ์ˆ˜๋Š” ๋ฏธ๋“ค์›จ์–ด์—์„œ ์ฒด์ธ ์•„๋ž˜๋กœ ๋” ๋ฉ€๋ฆฌ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

app.get('/api/userinfo',
  passport.authenticate('bearer', { session: false }),
  function(req, res, next) {
    // access control middleware to check for required scope
    if (req.authInfo.scope != 'profile') {
      res.statusCode = 403;
      return res.end('Forbidden');
    }
    return next();
  }
  function(req, res) {
    res.json(req.user);
  });

info ๋Š” ์ผ๋ฐ˜ JSON ๊ฐœ์ฒด์ด๋ฏ€๋กœ ์•ฑ์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ œ๊ณต๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ทœ์•ฝ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ฆ๋ช…๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
๋ฒ”์šฉ ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ์—๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ์ด๋ฅผ ํ™œ์šฉํ•˜๋Š” OAuthorize ๋ฐ OAuth2orize ๊ฐœ๋ฐœ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค
OAuth 1.0 ๋ฐ 2.0 ์„œ๋ฒ„๋ฅผ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š”
๋‚˜๋Š” ๋‹น์‹ ์ด ๋งŒ๋“  ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ Quora ํŽ˜์ด์ง€๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค
์ด๊ฒƒ๋“ค์„ ๊ฑฐ๊ธฐ์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค!

์–ธ์ œ๋‚˜ ๊ทธ๋ ‡๋“ฏ์ด ํ”ผ๋“œ๋ฐฑ์„ ๋ณด๋‚ด์ฃผ์„ธ์š”. ๊ฑด๋ฐฐ!


์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.

https://github.com/jaredhanson/passport-http-bearer/issues/2#issuecomment -6966368

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰