0%

egg的egg-oauth2-server的用法

后台登录获得token

  • 结合umi,在defaultSetting.js文件配置客户端
1
2
3
4
oauth2: {
clientId: 'umi', // 客户端id
clientSecret: '11111', // 客户端密码
},
  • egg默认配置文件:config.default.js 配置oAuth2Server
1
2
3
4
5
6
7
8
9
// 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文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
'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中加入中间件
1
2
3
const { router, controller, oAuth2Server } = app;
// 前端获得token
router.all('/api/login', oAuth2Server.token(), controller.login.index);
  • login控制器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 登录
*/
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;
  • 前端访问路径解析
1
2
3
4
5
6
7
8
9
10
// 一定要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

-------------本文结束感谢你的阅读---------