eggjs / egg

🥚 Born to build better enterprise frameworks and apps with Node.js & Koa
https://eggjs.org
MIT License
18.9k stars 1.82k forks source link

egg-passport 例子太少了,根本用不明白啊,能不能多加点官方例子? #1355

Closed achaly closed 6 years ago

achaly commented 7 years ago
pingguokiller commented 7 years ago

我也觉得,这个文档和例子写了跟没写一样,所有的文件怎么写,搭建好了,如何使用?例子demo是什么?整了一下午,没搞明白,不如自己去研究egg session cookie

rrbe commented 7 years ago

我看了好几天……还跑去看了依赖的源码才明白,其实用法不难,就是根本不写清楚那些函数是干嘛的,对新手不是很友好啊……

atian25 commented 7 years ago

之前的 RFC 在:https://github.com/eggjs/egg/issues/38

egg-passport 只是对 http://passportjs.org/ 的 wrap,所以使用前需要先了解 passportjs 的基础用法。

也欢迎社区贡献文档。

buzai commented 7 years ago

我觉得自己的用户就自己做注册登陆吧,这样业务可以写的更灵活。 个人理解可以用页面控制分为两种: A: 如果页面在服务器渲染的,passport用来做第三方的账户登陆,配制好密钥,回调地址

1 回调地址的控制器里面判断是否成功拿到了第三方信息,

2 控制器里拿到了微薄id,查找数据库有没有用户绑定了这个微薄id,a.有用户绑定了直接返回渲染的首页并且回传token。b.没有用户绑定过,渲染一个页面提示用户绑定,在这个页面里提交用户名,密码,微薄id到一个接口(依据你用邮箱,手机号,昵称使用不同的方式验证用户)。用户验证通过了在这个接口里绑定本地用户和微薄id,并且跳转到首页,如果失败了提示密码错误等

B:如果是单页面应用那访问第三方获用户信息的工作只能让前端来做,在回调页面访问接口把获取到的信息通过一个接口发给服务器,服务器根据信息eg:微薄id判断,如果本地用户绑定过直接返回本地用户的token和状态码告诉页面直接显示登陆之后的页面,如果没绑定过那么服务器返回状态码告诉前端显示绑定的页面,剩下的就是和上面一样验证用户判断是否绑定了。

acodercat commented 7 years ago

egg-passport就是auth2吗

atian25 commented 7 years ago

oauth 是一种协议规范,在这之上会有一些具体的实现,如微信开发平台,如 Twitter 等,passportjs 有此类的插件 http://passportjs.org/features

acodercat commented 7 years ago

那egg-passport可以用来验证自己的api吗,类似jwt这种

atian25 commented 7 years ago

你看看我那个链接,passportjs 有 passport-jwt 的扩展,你参考 egg-passport-xx 自己封装一个 egg-passport-jwt 即可

zhanghuaqiang commented 7 years ago

@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.

xycloud commented 6 years ago

试了下egg-passport-github,按照readme里面写的根本跑不起来。看到这个issue才发现不只是我一个人觉得文档例子没法理解。能不能出一个可以npm run dev直接跑起来的demo

atian25 commented 6 years ago

这个跑不了?

https://github.com/eggjs/examples/tree/master/passport

zhennann commented 6 years ago

主要有两点:

  1. mount路由
  2. 提供verify回调函数

也可以参考这个demo https://github.com/zhennann/egg-born-showcase-watch-articles/blob/master/src/module/aa-login-sync/backend/src/main.js

  // 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);
  });
xycloud commented 6 years ago

提示

Error in /passport/github
Please set config.keys first

github的key和secret我已经配置

atian25 commented 6 years ago

你这个很老的了吧。。。跟这个插件没关系,就是加个 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.

xycloud commented 6 years ago

很老是什意思? egg版本?

atian25 commented 6 years ago

在配置文件里面加一个 config.keys = '你自己一个随机数' 即可,这个报错跟这个 issue 没啥关系,那是半年前的 egg 发布 1.0 的时候,egg-cookie 的一个变更了。

如果是新的,那可能是你 config 配置错了,是不是覆盖 module.exports 了

xycloud commented 6 years ago

egg-passport这么多协议,如何在middleware哪一层拦截所有的路由都需要登陆,除了各自passport插件的登陆或者callback url

atian25 commented 6 years ago

自己在 middleware 里面判断 ctx.userctx.isAuthenticated()

xycloud commented 6 years ago

一个网站可能支持多种登陆方式,怎么根据用户采用的passport登陆方式(github, weibo等)来决定忽略哪些路由呢?

atian25 commented 6 years ago

可以看下 example 和源码,拿到的 user 数据应该有区别的

atian25 commented 6 years ago

写了一版文档:https://eggjs.org/zh-cn/tutorials/passport.html

xycloud commented 6 years ago

在同时支持多种Strategy登陆方式的时候,如何知道当前用于是以何种Strategy登陆的?有没有ctx.passport.strategy这种变量?

atian25 commented 6 years ago

返回的 user 里面有一个 provider 的

https://github.com/eggjs/egg-passport-github/blob/master/app.js#L19

xycloud commented 6 years ago

谢谢!文档很用心,赞

xjchenhao commented 6 years ago

egg的开发人员回复真积极,6的飞起,谢谢🙏

lijax commented 6 years ago

@zhanghuaqiang 不用修改源代码,options里把successReturnToOrRedirect设置为null即可;

const jwtAuth = app.passport.authenticate('jwt', {session: false, successReturnToOrRedirect: null});