标签:localhost .json file 必须 listen oca 第三方服务 .com 开发项目
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。常见的采用微信、QQ、微博、Facebook、Google账号登陆网站的过程都是采用了OAuth技术。这一章我们会以使用Google账号登陆第三方网站为例,展示如何使用这项技术。
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密钥。如果想要看详细步骤,参考这里。
接下来要把刚才生成的clientID和clientSectrect,传入Google OAuth模块中。注意,clientSecrect不能公布,谨慎起见clientID也应该保密。所以我们不希望别人通过查看源代码的形式获取这两个值。目前我们先通过不提交这部分代码的形式做到隐藏这部分信息。
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);
Node with React: Fullstack Web Development 课程手记(二)——Google OAuth
标签:localhost .json file 必须 listen oca 第三方服务 .com 开发项目
原文地址:http://www.cnblogs.com/demonmonk/p/7794506.html