Node.js NodeJS+;Express:Passport vs OAuth2与作用域(访问权限)的关系

Node.js NodeJS+;Express:Passport vs OAuth2与作用域(访问权限)的关系,node.js,express,oauth-2.0,passport.js,oauth2orize,Node.js,Express,Oauth 2.0,Passport.js,Oauth2orize,假设我在API.example.com实现一个API服务,它需要使用OAuth2以足够的粒度来保护其端点,以适应不同的用户类型 通过Facebook身份验证的用户只能访问https://api。example.com/Facebook 通过Twitter身份验证的用户只能访问https://api。example.com/Twitter 通过授权服务进行本地身份验证的用户可以访问facebook和twitter端点 这意味着我们有以下角色: 身份验证提供商(授权服务器、Facebook、T

假设我在API.example.com实现一个API服务,它需要使用OAuth2以足够的粒度来保护其端点,以适应不同的用户类型

  • 通过Facebook身份验证的用户只能访问https://api。example.com/Facebook
  • 通过Twitter身份验证的用户只能访问https://api。example.com/Twitter
  • 通过授权服务进行本地身份验证的用户可以访问facebook和twitter端点
这意味着我们有以下角色:

  • 身份验证提供商(授权服务器、Facebook、Twitter)
  • 授权提供程序(我的OAuth2服务器)(auth.example.com)
  • 资源提供者(我的API服务器)(API.example.com)
  • ExpressJS webapp或SPA(www.example.com)或本机应用程序
问题:

Q1应用程序流程应该如何实现

我的想法是

webapp必须在会话中将accessToken存储到api.example.com,并将会话ID发送到web浏览器。如果没有accessToken,它必须将浏览器重定向到auth.example.com/login/selectprovider/,提供客户端id=“www.example.com”和客户端密钥,并重定向\u url=“https://www.example.com/”

在https://auth.example.com/login/selectprovider/用户选择facebook或twitter或本地,然后auth。example.com将用户(再次)重定向到/login或facebook或twitter,使用客户端id和客户端密码并重定向\u url=https://auth.example.com/twitter或https://auth.example.com/twitter轻松区分这三种

Facebook/twitter/local方法将对用户进行身份验证,并将浏览器重定向回auth.example.com

auth.example.com随后将为api.example.com生成(承载)accessToken,并将其与user.id一起存储到本地数据库表中,该表具有关联的作用域(“facebook”、“twitter”或“local”),将密钥(userId)放入浏览器会话中,并重定向到https://www.example.com/

现在,当用户单击WebApp中的链接时,www.example.com会在api.example.com上执行GET或POST操作,提供client\u id=“www.example.com”client\u secret和access\u令牌

api.example.com端点验证accessToken,如果ok,则执行api并将值返回给www.example.com,并将其呈现给用户的浏览器

Q2高于正确的流量,或者有更好的方法吗? 如果正确,api.example.com如何在其端点验证accessToken

auth.example.com是否应该为此公开一个特殊的端点(例如/userinfo),该端点只能通过客户端id=“api.example.com”和客户端密码访问?对于每个调用来说,这样做似乎很昂贵,但是api.example.com如何信任令牌的有效性(因为它已过期或用户已注销)

符合OAuth2标准的方式是什么

Q3在passport/OAuth2orize示例中,我看到了验证身份的3种方法:

  • 如果(请求用户){…}
  • 如果(req.isAuthenticated()){…}
  • passport.authenticate('持有者',{会话:false)
Q4passport.authenticate('facebook')的具体功能是什么

该信息在战略中提供

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://localhost:3000/auth/facebook/callback"
  },
  function(accessToken, refreshToken, profile, cb) {
    User.findOrCreate({ facebookId: profile.id }, function (err, user) {
        return cb(err, user);
    });
  }
));
这包含客户端id和客户端密码。何时使用?每次调用passport.authenticate(“facebook”)时?是否会将整个重定向到facebook登录页面,获得授权码授权并将其交换为accessToken,以某种方式在内部存储accessToken,并将其保留到注销

这似乎不太可能,但我不知道如果没有这些,它如何才能真正对用户进行身份验证。而且对每个API调用进行身份验证的成本太高,因此我确信它的工作效率更高。但我不知道如何进行身份验证,并且研究源代码并没有让它更清楚

Q5api**.example.com如何知道www.example.com在每个api请求中包含的承载accessToken何时未伪造或过期


我假设它必须对照auth.example.com服务进行检查,该服务反过来必须检查facebook/twitter会话是否仍然有效,并在此时使用refreshToken刷新令牌?

一种简单但幼稚的方法是使用
窗口。referer
,但这只适用于前端h问题您认为您提供了一个有用的答案吗?以验证当前的使用范围。据我所知,您需要一种方法来确保Facebook授权的提供商仅访问/Facebook等。在进行前端呼叫时,您可以使用referrer查看当前的URL状态或范围(如果实现)。我问我的资源服务器如何知道它可以管理对其端点的访问,我不明白。什么?