passport.js 值得一试

342 阅读2分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战

OAuth2.0

总所周知,OAuth2.0 是一个标准协议,可以根据这个协议实现授权的功能。使用场景比较多的就是用户通过这个协议进行授权,然后用这个协议让一个系统访问另一个系统。整个流程(主要说的是 OAuth2.0 的授权码模式)如下:

  • 客户端拼成url(url = clientId + grant_type+回调地址+scopes)访问授权端点(授权服务器)。
  • 服务端收到请求时,返回授权码到回调地址(部分系统需要系统的确认授权后才会返回回调地址)。
  • 客户端收到授权码后,使用授权码去服务端换取 Token。
  • 客户端获取到 Token 后就可以请求其他的资源,比如获取用户信息,此过程服务端都会校验 Token。

整个过程基本形成了一个标准。可以将此流程抽象出一种模式,这样在我们使用其他系统作为 Identity Provider 进行对接可以减少很多重复工作。

passport.js

近期发现一个 Nodejs 的中间件 passport.js 其主要提供就是做登录验证的中间件。 passport.js 专而精,虽然只做登录验证,但是其支持本地账号验证和第三方账号登录验证,且支持大多数Web网站和服务。查看其中的源代码,你可以看到其很好的利用了策略模式。

简单使用一下:

async function startOauth(ctx) {
    const req = ctx.request;
    const res = ctx.response;
​
    try {
        const strategy = new GitlabStrategy({
            clientID: cfg.GITLAB_APP_KEY,
            clientSecret: cfg.GITLAB_APP_SECRET,
            gitlabURL: "https://gitlab.com",
            callbackURL: "http://127.0.0.1:9001/oidc/callback"
        },
            function (token, tokenSecret, profile, done) {
                console.log(token)
            });
​
        const params = {
            state: "state"
        }
        passport.use(strategy);
        passport.authenticate(strategy, params, (err) => {
            // TODO: 把 err 返回给前端
            console.log(err);
        })(req, res);
    } catch (error) {
        console.log(error);
    }
}

简单尝试了一下其提供的功能完成和gitlab 的授权登录,其还提供很多其他的应用对接。

参考资料:

\