OAuth是一个关于受权(authorization)的开放网络标准,在全世界获得普遍应用,目前的版本是2.0版。常见的采用微信、QQ、微博、Facebook、Google帐号登录网站的过程都是采用了OAuth技术。这一章咱们会以使用Google帐号登录第三方网站为例,展现如何使用这项技术。node
npm install --save passport passport-google-oauth20复制代码
2.0
,由于npm的包名称中不能有.
,因此就起名为20了,其实这里也能够不加20,那么安装的就是一个1.0
和2.0
的组合版。鉴于如今基本知名的auth provider都已经支持OAuth2.0,因此这里采用2.0
版本。详情参见passport-google-oauth github。const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
passport.use(new GoogleStrategy());复制代码
启用Google API
,搜索Google +
,选择 Google + API
, 点击启用
如今此API依然不能使用,须要点击点击建立凭据
按钮,按照提示流程一直走到最后,生成凭据,主要包含两个信息clientID和client密钥。若是想要看详细步骤,参考这里。git
接下来要把刚才生成的clientID和clientSectrect,传入Google OAuth模块中。注意,clientSecrect不能公布,谨慎起见clientID也应该保密。因此咱们不但愿别人经过查看源代码的形式获取这两个值。目前咱们先经过不提交这部分代码的形式作到隐藏这部分信息。github
module.exports = {
googleClientId: '1229722414-eeujg12q0q9gvisar.apps.googleusercontent.com',
googleClientSecret: 'ANPiCt5QFTa'
};复制代码
keys.js
,确保包含敏感信息的文件不会被提交const keys = require('./config/keys');
passport.use(new GoogleStrategy({
clientID: keys.googleClientId,
clientSecret: keys.googleClientSecret,
callbackURL: '/auth/google/callback'
}, (accessToken, refreshToken, profile, done) => {console.log(accessToken)}));复制代码
/auth/google
的请求,使用passport启用Google OAuth的验证流程,须要获取的信息有用户资料和邮箱。passport.authenticate
方法第一个参数传入了google
,那么就采用Google OAuth strategy模块验证。app.get(
"/auth/google",
passport.authenticate("google", {
scope: ["profile", "email"]
})
);复制代码
localhost:5000/auth/google
,按理应该会弹出google认证的页面,可是不幸的是并无,这时弹出的是一个400页面,大概的意思是说实际提供的验证回调地址和在console.developers.google.com中设定的不一致。还提供了一个连接,直接访问这个连接就进入了修改验证回调URL的页面。
已获受权的重定向 URI
这一项设为http://localhost:5000/*
,事实上这里须要严格匹配。以前在代码中咱们设定callbackURL
为/auth/google/callback
,因此咱们应该在这个修改页面中将已获受权的重定向 URI
这一项设为http://localhost:5000/auth/google/callback
,这样以后应该就能正常弹出受权页面了。Cannot GET /auth/google/callback
。咱们尚未设置针对回调route的handler,因此固然会报错了。在这个页面的URL中,会看到一个参数code,这就是在以前流程图中提到的Google服务器返回的code。咱们app的服务器拿到code后,就能够经过code再次向Google服务器发请求,并拿到用户的资料、邮箱等信息了。因此接下来须要补上对应的route handler。app.get('/auth/google/callback', passport.authenticate('google'));复制代码
localhost:5000/auth/google
,点击帐户登陆,能够看到在启动server的控制台中打印出了一坨东西。以前咱们在配置passport中传入了一个回调函数,在回调函数中打印出了token。这一坨就是取到的token。
passport.use(
new GoogleStrategy(
{
clientID: keys.googleClientId,
clientSecret: keys.googleClientSecret,
callbackURL: "/auth/google/callback"
},
(accessToken, refreshToken, profile, done) => {
console.log('accessToken', accessToken);
console.log('refreshToken', refreshToken);
console.log('profile', profile);
console.log('done', done);
}
)
);复制代码
nodemon
。npm install --save-dev nodemon
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
},复制代码
npm run dev
,就能够启动服务器,而且每次修改代码保存后,nodemon都会帮咱们自动重启服务器了。├── config
│ └── keys.js
├── index.js
├── package-lock.json
├── package.json
├── routes
│ └── authRoutes.js
└── services
└── passport.js复制代码
const passport = require('passport');
module.exports = (app) => {
app.get(
"/auth/google",
passport.authenticate("google", {
scope: ["profile", "email"]
})
);
app.get("/auth/google/callback", passport.authenticate("google"));
}复制代码
const passport = require('passport');
const GoogleStrategy = require("passport-google-oauth20").Strategy;
const keys = require("../config/keys");
passport.use(
new GoogleStrategy(
{
clientID: keys.googleClientId,
clientSecret: keys.googleClientSecret,
callbackURL: "/auth/google/callback"
},
(accessToken, refreshToken, profile, done) => {
console.log('accessToken', accessToken);
console.log('refreshToken', refreshToken);
console.log('profile', profile);
console.log('done', done);
}
)
);复制代码
const express = require("express");
const app = express();
require('./services/passport');
require('./routes/authRoutes')(app);
app.get("/", (req, res) => {
res.send({ hi: "there" });
});
)
const PORT = process.env.PORT || 5000;
app.listen(PORT);复制代码
next section数据库