Node.js 如何使用 Node.js Passport-Baidu 的 NPM包来进行oAuth验证 Authorization Code 方式

oAuth不只是目前互联网最通用的 IDP 方式。 如果在使用node.js的话, 可以使用Passport-Baidu 的增强包。Passportjs 先获取accesstoken, 用户 profile, 再把 session cookie/ session token 传递到前端。

大部分的技术文档说明使用了 SPA (Single Page Application), 如 React, Vue最好是用 Implicit Grant的方式, 但是这样就等于把 clientID放到前端了。 如果是要用 Authorization Code 方式的方式, 关键是从前端是不可以使用 AJAX/ AXIOS来访问API ‘/auth/baidu’, 一定要使用完整的URL, 例如 https://www.ABCDUCXU.com/auth/baidu

使用Vue.js的例子 : 

<div class = "q-pt-md" >
<a v-bind:href="urlBaidu">
<button label="Baidu Login" color="orange"/>
</a>
</div>

不能用:  axios.get('auth/baidu').

用了axios会弹出 COR(Cross -Origin)错误

如何使用 Node.js Passport-Baidu NPM 

http://www.passportjs.org/packages/passport-baidu/

1. 我创建了两个 .js文件。
第一个是 AuthorizationController, 主要负责所有登入/登出逻辑。第二个是 authroutes.js, 是所有对外api的路径。

2. 在AuthorizationController, 我使用的是

const BaiduStrategy = require('passport-baidu').Strategy

passport.use(new BaiduStrategy({
    clientID: client_id, //是您的BAIDU 应用的 API key
    clientSecret: client_secret,
    callbackURL: "http://***域名/auth/baidu/callback"
  },
  function(accessToken, refreshToken, profile, done) {
//如果使用的是Mongoose Model User, 查询User是否已经有Baidu用户明。 如果使用的不是Mongoose或 MongoDB, 可以用别的方式查询 User.findOrCreate({ baiduId: profile.id }, function (err, user) { return done(err, user); }); } ));

Baidu 会传的 Profile 是以下的 Object
{ provider: 'baidu',
id:
username: ',
displayName: undefined,
gender: undefined,
photos:
[ { value:
},
{ value:
' } ],
_raw:
'{"portrait":}',
_json:
{ portrait: ',
username: '猫',
is_bind_mobile: '1',
is_realname: '1',
birthday: '0000-00-00',
openid: '*****111102' } }

2. 在authroutes.js, 关键的两个入境 

var express = require('express');
var router = express.Router();
var passport = require('passport');

router.get('/auth/baidu',
passport.authenticate('baidu', {
}
));

router.get( '/auth/baidu/callback',
passport.authenticate( 'baidu', {
callback: true,
successRedirect: '/' ,
failureRedirect: '/'
})
)

3. 登出的逻辑跟其他passport的方式一摸一样, 如

function logout (req, res) {
req.logout();
return res.send();
};

 

 

除了百度之外, Node.js Passportjs 还有微信, 国际google, facebook 的oAuth验证插件。 

唯一要修改的是 passport.use(new BaiduStrategy({......这段。