egg的egg-oauth2-server的用法
原创大约 2 分钟
后台登录获得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