-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[RFC] 抽取 passport 模型 #38
Comments
以 oauth 登录作为标准的示例实现。 |
哈哈,这个也挺老了 |
@popomore 我看它是最完善的。 |
淘宝登录也有需求 egg-taobao-login |
egg-dingtalk-login 🤔 |
认领 egg-weibo-login,接一个先试试 |
看来还是得封装 |
这些 passport 的 adapter 跟插件有些区别吧,需允许多个共存,不一样的 eggPlugin.name? |
感觉直接传 Strategy 实例比较好,不同的 Strategy 参数不一样,也可能会有两个。 exports.passport = {
strategy: [
new TwitterStrategy({
consumerKey: TWITTER_CONSUMER_KEY,
consumerSecret: TWITTER_CONSUMER_SECRET,
callbackURL: "http://127.0.0.1:3000/auth/twitter/callback"
},
function(token, tokenSecret, profile, cb) {
User.findOrCreate({ twitterId: profile.id }, function (err, user) {
return cb(err, user);
});
})
]
}; |
把 passport 的 callback API 都要改成 promise 的 |
auto0 还有一个 params 参数: |
@popomore 还是改成 passport-xx 模式了,每个插件都需要按照统一 user 数据格式实现 verify 方法,生成一个 user,再由应用自行实现总的 verify 来做最终用户校验。没办法每个插件能使用到数据库实现 verify 的。 |
但这个就不算 passport 了,用什么来存储用户信息和 passport 没关系。内部可以直接在 Strategy 里面封装获取用户信息。 |
@popomore 对啊,内部应用代码就不需要实现 verify 了 |
app.passport.verify 的 hook 就是替换 strategy 里的 verify callback 么? |
@popomore 不完全是,strategy verify callback 有 passport-xxx 插件实现。而 app.passport.verify 是我们封装过的,给应用使用的。这样一个应用同时接入多种 strategy,都可以通过同一个 app.passport.verify 实现最终核实过程。 |
demo eggjs/examples#14 |
对于每次都去缓存读取用户信息的 user,需要默认关闭 passport-session 策略。
const auth = app.passport.authenticate('alipaysession', {
session: false,
successReturnToOrRedirect: false,
successRedirect: false,
});
// 将 auth 加入全局中间件,让每个请求都过 alipaysession
app.use(auth); 但是要追求高性能的话,alipaysession 应该直接走普通中间件,不走 passport 这台,因为它是每次请求都去缓存读取数据的。 |
@shaoshuai0102 https://github.com/eggjs/egg-passport-weibo 基本不需要做,我需要想想怎么 mock 方便写单元测试才是王道。 |
这个是不是还缺篇文档? |
恩,要加一下 |
passport-local 该怎么做?有参考么? |
@yandongxu 我也不会这个 passport-local |
@leiyanggz 这个没写测试? |
为什么在egg-passport中, 重写passport的方法时, 要把callback去掉, 是暂时不支持还是不打算支持呀? |
@jackhutu 我们最佳实践是 generator function 和 async function,所有的代码应该看不到 callback。 |
@fengmk2 本地鉴权怎么用啊?感觉调用this.app.passport.serializeUser并没有成功啊 session里没有东西 |
|
tsc throw errors when tsconfig.json set "declaration": true config/defaultConfig.ts(9,1): error TS4082: Default export of the module has or is using private name 'DefaultConfig'. config/defaultConfig.ts(13,28): error TS4033: Property 'config' of exported interface has or is using private name 'DefaultConfig'. define interface NewsItem as return type of HackerNews.getItem() for types recognition app/controller/news.ts: variable newsList can be recognized as type of NewsItem[] correctly instead of an object missing array
RFC: passport
由于业界的 passport 已经足够简单,egg 做起来就是配置。对应应用开发者,更加是配置,基本无需编写代码就能实现。
一个应用的 authenticate 通用过程
app.passport.verify
hook,这样应用层就能做最终的核实,例如做新用户注册,老用户绑定校验等等,这里也是用户数据持久化的地方。app.passport.deserializeUser
和app.passport.serializeUser
来还原 session。说明
如要对接 Twitter 的 oauth,那么只需要引入 passport-twitter,并实现一个 passport-twitter 插件即可。
统一 user 字段约定
ctx.user
是一个 getter,真实数据来自于ctx.state.user
。每个 passport-xxx 插件都需要按照约定封装一个 user。
user.provider
: 用户信息来自那种登录策略,如 twitter, weibo, facebook,这样就能通过此字段读取user.profile
信息了。一般都是自动填充user.id
: 用户 id,字符串user.name
: 用户名user.displayName
: 昵称user.token
: oauth1 的话必须提供user.tokenSecret
: oauth1 的话必须提供user.accessToken
: oauth2 的话必须提供user.refreshToken
: oauth2 的话必须提供user.profile
: profile 的其他字段,每个平台提供的都不太一样,需要各种区别passport 配置
应用需要关注的3个用户数据处理 hooks
The text was updated successfully, but these errors were encountered: