You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
在日常的业务使用场景中,涉及到获取用户信息的场景基本流程是,用户登录后系统才能获取到该信息。
假设用户使用系统 A,如果需要展示系统 A 存储的用户信息,那只需提供在系统 A 注册的用户名和密码即可。如果需要在系统 A 上展示用户的 GitHub 基本信息,系统 A 是没有该用户的 GitHub 登录名和密码的,需要用户提供,这种情况下存在以下弊端:
系统 A 为了后续能够继续展示用户的 GitHub 信息,会保存用户的登录信息
系统 A 能够读取用户在 GitHub 上的所有信息,包括公开信息和私密信息,用户无法限制系统 A 访问 GitHub 的权限和范围
如果用户想收回系统 A 访问 GitHub 的权限,只能修改登录信息,这样会影响该用户之前授权给的其他第三方服务
一旦系统 A 被破解了,所有存储的用户信息都会泄露,包括通过账号密码授权方式给系统 A 的应用信息也会被泄露
// app.jsmodule.exports=app=>{app.passport.verify(async(ctx,user)=>{});// 为了保持数据量小,只把 id 序列化后存进 session 里面app.passport.serializeUser(async(ctx,user)=>{});// 反序列化后,根据 id 把用户信息从数据库中取出来app.passport.deserializeUser(async(ctx,id)=>{});};
应用场景
在日常的业务使用场景中,涉及到获取用户信息的场景基本流程是,用户登录后系统才能获取到该信息。
假设用户使用系统 A,如果需要展示系统 A 存储的用户信息,那只需提供在系统 A 注册的用户名和密码即可。如果需要在系统 A 上展示用户的
GitHub
基本信息,系统 A 是没有该用户的GitHub
登录名和密码的,需要用户提供,这种情况下存在以下弊端:GitHub
信息,会保存用户的登录信息GitHub
上的所有信息,包括公开信息和私密信息,用户无法限制系统 A 访问GitHub
的权限和范围GitHub
的权限,只能修改登录信息,这样会影响该用户之前授权给的其他第三方服务基于以上问题,
OAuth
诞生了。OAuth
Wiki
的定义:简单来说,
OAuth
在客户端与服务提供商之间,设置了一个授权层(authorization layer
)。客户端不能直接登录服务提供商,只能登录授权层,以此将用户与客户端区分开来。客户端登录授权层所用的令牌(token
),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。客户端登录授权层以后,服务提供商根据令牌的权限范围和有效期,向客户端开放用户储存的资料。
Passport
Passport 是用于
Node.js
程序的中间件鉴权方式。它在OAuth
的基础上,以中间件的方式插入到Node.js
程序当中,非常的灵活简便;通过Passport
开发者可以使用鉴权方式访问Github
,Twitter
,Facebook
等服务厂商;也可以通过用户名和密码的方式进行登录授权校验。passport
提供了很多知名服务厂商的strategy
如:passport-github
,passport-twitter
等。Egg 的解决方案
Egg
推荐使用 egg-passport ,egg-passport
是基于 Passport 的Egg
插件,屏蔽了裸写passport
的一些细节,如初始化、鉴权成功后的回调处理等,并且提供了方便开发者使用的API
。和
passport
一样,egg-passport
提供了通过用户名密码授权方式和各大服务商授权的方式:各个步骤使用的 API:
进行登录验证:
passport
对鉴权的用户名和密码的处理业务方校验和存储用户:
app.passport.verify()
序列化用户信息存入
session
:app.passport.serializeUser()
反序列化用户信息从
session
取出:app.passport.deserializeUser
strategy
的授权方式鉴权以
GitHub
为例:如何使用 egg-passport
安装
配置
在
Egg
中开启该插件直接使用 passport-${strategy}
以
Github
为例:需要创建一个 OAuth Apps,填写好基本信息之后会得到
clientID
和clientSecret
,注意callbackURL
也是必不可少的,这里假设callbackURL
是 http://127.0.0.1:7002/auth/github/callback然后安装
GitHub
的strategy
插件鉴权通过后,应用层用户一般还需要处理一些事项,如校验和存储用户信息等。
使用 egg-passport-${strategy}
如果觉得上面的这种配置方式很繁琐,可以通过安装 egg-passport-github 来简化配置流程:
开启插件:
注意这里配置的字段是
key
和secret
校验和存储用户信息:
使用用户名密码方式鉴权
passport-local
strategy
这里页面模板以
egg-view-ejs
为例配置信息
APIs
extend
application
app.passport.mount(strategy, options)
: 用指定的strategy
来设置登录鉴权路由和鉴权后回调方法的路由配置app.passport.authenticate(strategy, options)
:配置strategy
和options
来创建一个中间件,用于鉴权使用app.passport.verify(async (ctx, user) => {})
:校验用户app.passport.serializeUser(handler)
: 序列化用户信息后存储进session
app.passport.deserializeUser(handler)
:反序列化后取出用户信息extend
context
ctx.user
:获取当前已登录的用户信息ctx.isAuthenticated()
:检查该请求是否已授权ctx.login(user[, options])
:为用户启动一个登录的session
ctx.logout()
:退出,将用户信息从session
中清除如何开发
egg-passport-${provider}
插件以上面的
egg-passport-github
为例egg-passport
,主要是使用其APIs
注意:必须使用
key
和secret
代替consumerKey|clientID
和consumerSecret|clientSecret
,这样有利于保持一致的开发体验app.js
中初始化Strategy
并且在verify callback
中格式化用户信息如何开发
egg-passport-local
以下以本地开发为例,后续发布为插件形式:
好了,到这已经开发好了,如何使用呢?
参考文档
egg-passport
The text was updated successfully, but these errors were encountered: