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數據庫