大家有没有使用redux-saga,jwt做登录的示例代码?

#1

因为不想让服务器保持session所以希望能用jwt来认证以及权限分配。现在遇到很多问题 比如怎样在saga里面定期refresh token\route 里面怎样来根据权限加载等等等。。。
大家有没有好的示例代码能够共享一下的:D

要能线下交流就更好了,人在北京:)

目前已经找到的资料有:
jwt 官方提供的 https://auth0.com/blog/2016/01/04/secure-your-react-and-redux-app-with-jwt-authentication/
login flow系列的 https://github.com/sotojuan/saga-login-flow

PS:react是个大坑:)

#2

我也在用redux saga. 你说的这个问题我也正在写。我写的比较简单,分开监听login和log out,应该就不存在login flow里的问题了吧。
刷新token我觉得如果是第三方登录的话,可能你要看第三饭登录的文档来做这个。只是自己的我觉得没必要那么复杂,简单的服务端刷新token,客户端替换就好。
权限的话,我觉得交给服务端判断比较好。然后这边在catch里做相应的处理就可以了。要是做什么目录的权限管理。。。这估计要去stackoverflow上问了。当然如果是服务端渲染的项目,可能可以考虑在服务端路由上做文章。

下面是我登录的代码,可能你已经写好了。。大家相互交流吧。貌似redux-saga用的人不是很多。

import { takeEvery } from 'redux-saga'
import { fork, call, put } from 'redux-saga/effects'
import { push } from 'react-router-redux'
import * as types from './types'
import http from './../../utils/http'
function* asyncLogin(action) {
  try {
    const loginResult = yield call(http.auth.Login, action.loginValues)
    localStorage.setItem('id_token', loginResult.token)
    yield put({ type: types.LOGIN_SUCCESS, loginResult })
    yield put(push('/'))
  } catch (error) {
    yield put({ type: types.LOGIN_FAILURE, error })
  }
}
function* watchLogin() {
  yield* takeEvery(types.LOGIN_REQUEST, asyncLogin)
}
export default function * () {
  yield [
    fork(watchLogin),
  ]
}
#3

谢谢你的回复,这真是一个有爱的社区 :kissing_heart: 问题几周前已经完美解决了:) 跟你分享一下我的经验,如果有什么不足不吝斧正
前端方面就像你所给出的代码,之前提出的问题 主要还是靠后端来解决

  1. **身份验证问题,**依旧用jwt. 我用express + passport来解决。
  • 本地账号登录,发送账号密码到 /api/auth/getToken 验证通过后 jsonwebtoken生成token 返回客户端
  • 第三方登录,通过 /api/google/ 来验证,通过后调用 /api/google/callback生成token 返回客户端
  1. 保护路由(权限分配)
  • 首先 借鉴了reactboilerplate模板 的方案。containers异步加载, 同时 reducer state action也是异步加载。在这个然后使用passport-jwt 作为中间件来做验证。
  • 权限分配,在jwt的payload里面增加role,客户端解析jwt后得到role来判断是否有权限。这样做减少了数据库的查询。根据jwt的原理 也不需要担心 客户端修改token 来获取高权限。

代码还比较乱,稍后整理完po上来。