Skip to content
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

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

Closed
achaly opened this issue Aug 25, 2017 · 26 comments

Comments

@achaly
Copy link

achaly commented Aug 25, 2017

  • Node Version:
  • Egg Version:
  • Plugin Name:
  • Plugin Version:
  • Platform:
  • Mini Showcase Repository:
@pingguokiller
Copy link

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

@rrbe
Copy link

rrbe commented Aug 25, 2017

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

@atian25
Copy link
Member

atian25 commented Aug 30, 2017

之前的 RFC 在:#38

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

也欢迎社区贡献文档。

@buzai
Copy link

buzai commented Aug 30, 2017

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

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

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

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

@acodercat
Copy link

egg-passport就是auth2吗

@atian25
Copy link
Member

atian25 commented Aug 31, 2017

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

@acodercat
Copy link

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

@atian25
Copy link
Member

atian25 commented Aug 31, 2017

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

@zhanghuaqiang
Copy link

zhanghuaqiang commented Nov 6, 2017

@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
Copy link

xycloud commented Nov 30, 2017

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

@atian25
Copy link
Member

atian25 commented Nov 30, 2017

@zhennann
Copy link
Contributor

zhennann commented Nov 30, 2017

主要有两点:

  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
Copy link

xycloud commented Dec 1, 2017

提示

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

github的key和secret我已经配置

@atian25
Copy link
Member

atian25 commented Dec 1, 2017 via email

@xycloud
Copy link

xycloud commented Dec 1, 2017

很老是什意思? egg版本?

@atian25
Copy link
Member

atian25 commented Dec 1, 2017

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

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

@xycloud
Copy link

xycloud commented Dec 1, 2017

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

@atian25
Copy link
Member

atian25 commented Dec 1, 2017

@atian25 atian25 closed this as completed Dec 1, 2017
@xycloud
Copy link

xycloud commented Dec 1, 2017

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

@atian25
Copy link
Member

atian25 commented Dec 1, 2017

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

@atian25
Copy link
Member

atian25 commented Dec 13, 2017

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

@xycloud
Copy link

xycloud commented Dec 14, 2017

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

@atian25
Copy link
Member

atian25 commented Dec 14, 2017

返回的 user 里面有一个 provider 的

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

@xycloud
Copy link

xycloud commented Dec 14, 2017

谢谢!文档很用心,赞

@xjchenhao
Copy link

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

@lijax
Copy link

lijax commented Apr 9, 2018

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests