当前位置: 首页 > 科技观察

Node.JS、Mongoose和Jade搭建OAuth2服务器

时间:2023-03-12 09:51:52 科技观察

今天我们来看一个Node.JS的实际应用。这是国外Paper应用开发者搭建的OAuth2服务器。使用的主要技术包括:-Node.JS的Express框架-Mongoose工具集,Mongodb的流行库,方便构建模型。-bcrypt,用于密码加密-superagent,用于测试Papers是一个论文数据库移动应用程序,适用于iOS和Android。写论文的同学会非常需要它。其介绍请见开发者官方博客。http://blog.papersapp.com/oauth-server-in-node-js/Papers虽然没有开源,但是作者把写好的node-oauth2-server模块和Papers的认证过程一起打包在了GitHub上,我们可以下载研究:https://github.com/mekentosj/oauth2-example在代码中的Models目录下,我们可以清楚的看到Model的Schema定义。从这里我们可以了解到OAuth2需要处理的主要数据结构,包括access_token、refresh_token、oauth_client.varOAuthAccessTokensSchema=newSchema({accessToken:{type:String,required:true,unique:true},clientId:String,userId:{type:String,required:true},expires:Date});varOAuthRefreshTokensSchema=newSchema({refreshToken:{type:String,required:true,unique:true},clientId:String,userId:{type:String,required:true},expires:Date});varOAuthClientsSchema=newSchema({clientId:String,clientSecret:String,redirectUri:String});varOAuthUsersSchema=newSchema({email:{type:String,unique:true,required:true},hashed_pa??ssword:{type:String,required:true},password_reset_token:{type:String,unique:true},reset_token_expires:Date,firstname:字符串,姓氏:字符串});通过在代码中运行seed.js,我们创建了一个用户.varapp=require('./app');varmodels=require('./models');models.User.create({email:'alex@example.com',hashed_pa??ssword:'$2a$10$aZB36UooZpL.fAgbQVN/j.pfZVVvkHxEnj7vfkVSqwBOBZbB/IAAK'},function(){models.OAuthClientsModel.create({clientId:'papers3',clientSecret:'123',redirectUri:'/oauth/redirect'},function(){process.exit();});});这样我们就可以开始体验这个OAuth2ServerforNode.JS先让Mongo运行,负责后台数据库,比如“mongod-dbpath./”,然后运行“npmstart”。oliverluan@localhost:~/Documents/EvWork/node_oauth2_example/oauth2-example$npmstart>oauth2-experiment@0.0。1start/Users/oliverluan/Documents/EvWork/node_oauth2_example/oauth2-example>./node_modules/.bin/nodemonserver.js14Apr07:02:43-[nodemon]v1.0.1714Apr07:02:43-[nodemon]随时重新启动,输入`rs`14Apr07:02:43-[nodemon]watching:*.*14Apr07:02:43-[nodemon]starting`nodeserver.js`connect.multipart()willberemovedinconnect3.0访问https://img.ydisp.cn/news/20220914/213rgomsl3yconnect.limit()willberemovedinconnect3.0Expressserverlisteningonport:3000POST/oauth/token200102ms-175bGET/secret2002ms-11b模拟一个Oauth2访问令牌请求,运行这个文件(nodegetToken=require.js)varrequest'要求');//client_idvart_client_id='papers3';//client_secretvart_client_secret='123';//clientCredentials以client_id:client_secret的形式组合,转换成Base64编码后的varclientCredentials=(t_client_id+':'+t_client_secret).toString('base64');//用户名vart_username='alex@example.com';//密码vart_password='test';console.log(clientCredentials);//发送Post请求获取Tokenrequest.post({url:'http://'+clientCredentials+'@localhost:3000/oauth/token',form:{grant_type:'password',username:t_username,password:t_password,client_id:t_client_id,client_secret:t_client_secret},},function(err,res,body){console.log(body);//获得TokenvaraccessToken=JSON.parse(body).access_token;request.get({url:'http://localhost:3000/secret',headers:{Authorization:'Bearer'+accessToken}},function(err,res,body){console.log(body);});});成功获得accesstoken.oliverluan@localhost:~/Documents/EvWork/node_oauth2_example/oauth2-example$nodegetToken.jspapers3:123{"token_type":"bearer","access_token":"620bb362f32857d5174802e0606530587","9:53597","9:53597"0,"refresh_token":"569be5f4cc1ea943021b3676eaa2a51825c2c257"}Secretarea原文链接:http://blog.csdn.net/u011581005/article/details/23650917