Passport-http-bearer: рд╕реНрдХреЛрдк рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рдорд╛рд░реНрдЪ 2012  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jaredhanson/passport-http-bearer

рд╣рд╛рдп рдЬрд╛рд░реЗрдб,

рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕рд┐рд░ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рдХрдард┐рди рд╕рдордп рд╣реИ рдХрд┐ рдкрд╛рд╕рдкреЛрд░реНрдЯ рд╕реНрдХреЛрдк рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ:

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЯреЛрдХрди рд╕реНрдЯреЛрд░ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдПрдХ рджрд╛рдпрд░рд╛ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдорд╛рд░реНрдЧ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рджрд╛рдпрд░реЗ рд╡рд╛рд▓реЗ рдЯреЛрдХрди рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЯреЛрдХрди рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореЗрд░реЗ рдРрдк рдореЗрдВ рдореИрдВ рдРрд╕рд╛ рдХреБрдЫ рдХрд░реВрдВрдЧрд╛:

app.use ('/ v1', рдкрд╛рд╕рдкреЛрд░реНрдЯред рдкреНрд░рдорд╛рдгреАрдХрд░рдг ('рд╡рд╛рд╣рдХ', {рд╕рддреНрд░: рдЭреВрдард╛}):

рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд╛рд░реНрдЧ рдХреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛, рдЬреИрд╕реЗ
.. рдкрд╛рд╕рдкреЛрд░реНрдЯред рдкреНрд░рдорд╛рдгреАрдХрд░рдг ('рд╡рд╛рд╣рдХ', {рд╕рддреНрд░: рдЧрд▓рдд, рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░: ['рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ']})

рдХреНрдпрд╛ рдпрд╣ рдкрд╛рд╕рдкреЛрд░реНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@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' });
    });
  }
));

рд╕реВрдЪрдирд╛ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдиреАрдЪреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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 рдореБрдЭреЗ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдЦреБрд╢ рд╣реВрдВ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ рдЖрдк рдЬреЛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред

рдЕрдм рдЖрдк рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░рд╛ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣ рдкрд╛рд╕рдкреЛрд░реНрдЯ рджреНрд╡рд╛рд░рд╛ 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' });
    });
  }
));

рд╕реВрдЪрдирд╛ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдиреАрдЪреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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 рдкреЗрдЬ рджреЗрдЦрд╛ рд╣реИ рдЬреЛ рдЖрдкрдиреЗ рдмрдирд╛рдпрд╛ рд╣реИред рдЗрдиреНрд╣реЗрдВ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛!

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореБрдЭреЗ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬреЗрдВред рдЪреАрдпрд░реНрд╕!

рдмрд╣реБрдд рдмрдврд┐рдпрд╛ рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рджред

рд╢реБрдХреНрд░рд╡рд╛рд░, 13 рдЬреБрд▓рд╛рдИ 2012 рдХреЛ рд╕реБрдмрд╣ 8:36 рдмрдЬреЗ, рдЬрд╛рд░реЗрдб рд╣реИрдирд╕рди <
рдЙрддреНрддрд░@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' });
    });
  }
));

рдЬрд╛рдирдХрд╛рд░реА рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЖрдЧреЗ рдиреАрдЪреЗ рд╣реЛрддрд╛ рд╣реИ
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рд▓рд╛рдЧреВ рдХрд░реЗрдВред

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/jarehanson/passport-http-bearer/issues/2#issuecomment -6966368

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

carera picture carera  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

danieljack picture danieljack  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

konijn picture konijn  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zsitro picture zsitro  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fuzihaofzh picture fuzihaofzh  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ