Closed achaly closed 6 years ago
我也觉得,这个文档和例子写了跟没写一样,所有的文件怎么写,搭建好了,如何使用?例子demo是什么?整了一下午,没搞明白,不如自己去研究egg session cookie
我看了好几天……还跑去看了依赖的源码才明白,其实用法不难,就是根本不写清楚那些函数是干嘛的,对新手不是很友好啊……
之前的 RFC 在:https://github.com/eggjs/egg/issues/38
egg-passport 只是对 http://passportjs.org/ 的 wrap,所以使用前需要先了解 passportjs 的基础用法。
也欢迎社区贡献文档。
我觉得自己的用户就自己做注册登陆吧,这样业务可以写的更灵活。 个人理解可以用页面控制分为两种: A: 如果页面在服务器渲染的,passport用来做第三方的账户登陆,配制好密钥,回调地址
1 回调地址的控制器里面判断是否成功拿到了第三方信息,
2 控制器里拿到了微薄id,查找数据库有没有用户绑定了这个微薄id,a.有用户绑定了直接返回渲染的首页并且回传token。b.没有用户绑定过,渲染一个页面提示用户绑定,在这个页面里提交用户名,密码,微薄id到一个接口(依据你用邮箱,手机号,昵称使用不同的方式验证用户)。用户验证通过了在这个接口里绑定本地用户和微薄id,并且跳转到首页,如果失败了提示密码错误等
B:如果是单页面应用那访问第三方获用户信息的工作只能让前端来做,在回调页面访问接口把获取到的信息通过一个接口发给服务器,服务器根据信息eg:微薄id判断,如果本地用户绑定过直接返回本地用户的token和状态码告诉页面直接显示登陆之后的页面,如果没绑定过那么服务器返回状态码告诉前端显示绑定的页面,剩下的就是和上面一样验证用户判断是否绑定了。
egg-passport就是auth2吗
oauth 是一种协议规范,在这之上会有一些具体的实现,如微信开发平台,如 Twitter 等,passportjs 有此类的插件 http://passportjs.org/features
那egg-passport可以用来验证自己的api吗,类似jwt这种
你看看我那个链接,passportjs 有 passport-jwt 的扩展,你参考 egg-passport-xx 自己封装一个 egg-passport-jwt 即可
@acodercat 封装egg-passport-jwt时,需要修改egg-passport插件中的代码,修改文件egg-passport/lib/passport.js.
authenticate(strategy, options = {}) {
// try to use successReturnToOrRedirect first
if (!options.hasOwnProperty('successRedirect') && !options.hasOwnProperty('successReturnToOrRedirect')) {
// app use set `ctx.session.returnTo = ctx.path` before auth redirect
options.successReturnToOrRedirect = '/';
}
if (!options.hasOwnProperty('failWithError')) {
options.failWithError = true;
}
return super.authenticate(strategy, options);
}
注释掉这行代码options.successReturnToOrRedirect = '/';
,这行代码的作用是为了在进行oauth2授权时,如果没有设置成功跳转链接,在授权完成后自动跳转到首页链接.
如果实现egg-passport-jwt插件,每个接口调用都会产生授权的过程,如果接口逻辑处理时间比较长,设置了successReturnToOrRedirect之后,就会提示404 not found.
试了下egg-passport-github,按照readme里面写的根本跑不起来。看到这个issue才发现不只是我一个人觉得文档例子没法理解。能不能出一个可以npm run dev
直接跑起来的demo
主要有两点:
// authenticates routers
app.passport.mount('github', {
loginURL: `/api/${info.url}/passport/github`,
callbackURL: `/api/${info.url}/passport/github/callback`,
});
// verify
app.passport.verify(async function(ctx, profileUser) {
return await ctx.service.user.verify(profileUser);
});
提示
Error in /passport/github
Please set config.keys first
github的key和secret我已经配置
你这个很老的了吧。。。跟这个插件没关系,就是加个 config.keys,用于 cookie 加签的。
发自我的 iPhone
在 2017年12月1日,13:56,sharkshark notifications@github.com 写道:
提示
Error in /passport/github Please set config.keys first github的key和secret我已经配置
— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.
很老是什意思? egg版本?
在配置文件里面加一个 config.keys = '你自己一个随机数'
即可,这个报错跟这个 issue 没啥关系,那是半年前的 egg 发布 1.0 的时候,egg-cookie 的一个变更了。
如果是新的,那可能是你 config 配置错了,是不是覆盖 module.exports 了
egg-passport这么多协议,如何在middleware哪一层拦截所有的路由都需要登陆,除了各自passport插件的登陆或者callback url
自己在 middleware 里面判断 ctx.user
或 ctx.isAuthenticated()
一个网站可能支持多种登陆方式,怎么根据用户采用的passport登陆方式(github, weibo等)来决定忽略哪些路由呢?
可以看下 example 和源码,拿到的 user 数据应该有区别的
在同时支持多种Strategy登陆方式的时候,如何知道当前用于是以何种Strategy登陆的?有没有ctx.passport.strategy这种变量?
返回的 user 里面有一个 provider 的
https://github.com/eggjs/egg-passport-github/blob/master/app.js#L19
谢谢!文档很用心,赞
egg的开发人员回复真积极,6的飞起,谢谢🙏
@zhanghuaqiang 不用修改源代码,options里把successReturnToOrRedirect设置为null即可;
const jwtAuth = app.passport.authenticate('jwt', {session: false, successReturnToOrRedirect: null});