「这是我参与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 的授权登录,其还提供很多其他的应用对接。
参考资料:
\