egg的egg-oauth2-server的用法

WuYiLong原创大约 2 分钟nodeegg

后台登录获得token

  • 结合umi,在defaultSetting.js文件配置客户端
 oauth2: {
    clientId: 'umi', // 客户端id
    clientSecret: '11111', // 客户端密码
  },
  • egg默认配置文件:config.default.js 配置oAuth2Server
 // oauth2
  config.oAuth2Server = {
    debug: appInfo.env === 'local',
    grants: [ 'password' ], // grants: ['password', 'authorization_code', 'refresh_token']
    clientId: 'umi', // 客户端id
    clientSecret: '11111', // 客户端密码,
    // accessTokenLifetime: 7200, // 自定义访问token的有效时间,默认一个小时有效期
    // refreshTokenLifetime: 86400, // 自定义刷新token的有效时间,默认15天有效期
  };

  • 在egg项目的extend目录下,创建oauth.js文件
'use strict';

const path = require('path');
module.exports = app => {

  // // Mock Data
  // nconf.use('file', {
  //   file: path.join(app.config.baseDir, 'app/mock/db.json'),
  // });

  class Model {
    constructor(ctx) {
      this.ctx = ctx;
    }

    // 传过来实参必须格式:client_id,client_secret,接收的形参可以是随意格式的变量
    async getClient(clientId, clientSecret) {
      const client = app.config.oAuth2Server;
      if (clientId !== client.clientId || clientSecret !== client.clientSecret) {
        return;
      }
      return client;
    }

    async getUser(username, password) {
      // 从数据库中获得登录者的账号和密码
      const user = await app.mysql.get('admin', { account: username });
      if (username !== user.account || password !== user.password) {
        return;
      }
      return { userId: user.id };
    }

    async getAccessToken() {
      // const token = nconf.get('token');
      // token.accessTokenExpiresAt = new Date(token.accessTokenExpiresAt);
      // token.refreshTokenExpiresAt = new Date(token.refreshTokenExpiresAt);
      // const user = nconf.get('user');
      // const client = nconf.get('client');
      // token.user = user;
      // token.client = client;
      console.log(2222);
      return 'tok';
    }

    async saveToken(token, client, user) {
      // 把token信息保存到数据库------TODO

      // 合并对象
      const _token = Object.assign({}, token, { user }, { client });
      // console.log(_token);
      return _token;
    }
  }

  return Model;
};

  • 在egg项目的router.js中加入中间件
const { router, controller, oAuth2Server } = app;
  // 前端获得token
  router.all('/api/login', oAuth2Server.token(), controller.login.index);
  • login控制器
/**
 * 登录
 */
const Controller = require('egg').Controller;
class LoginController extends Controller {

  // ctx.state.oauth.token
  async index() {
    const { ctx } = this;
    // 获得token:里面其实包含user,token,client的信息
    const token = ctx.state.oauth.token;
    // const result = await ctx.service.login.login(data);
    ctx.body = token;
  }
}

module.exports = LoginController;

  • 前端访问路径解析
// 一定要post请求
POST http://localhost:7002/api/login
// 头部headers的Content-Type一定要是表单提交
headers: {Content-Type: application/x-www-form-urlencoded}
// 请求参数必须要是以下的5个:
client_id,
client_secret,
grant_type,
username,
password

^这样才能成功获得token

上次编辑于:
贡献者: wuyilong