parse的官方文檔提到如何通過(guò)第三方賬號(hào)登陸注冊(cè),如facebook、twitter的登陸。同時(shí)也提供google、github等賬號(hào)的登陸能力。至于如何登陸,文檔里有簡(jiǎn)短描述但實(shí)驗(yàn)一直未成功,對(duì)國(guó)內(nèi)微信、QQ等賬號(hào)的登陸更是只字未提,原以為即使要使用也需要進(jìn)行二次開發(fā)。但近期看其源碼時(shí)竟然發(fā)現(xiàn)了oauth登陸微信、qq、微博等國(guó)內(nèi)openid的蹤跡
https://github.com/parse-community/parse-server/tree/master/src/Adapters/Auth
微信登陸和注冊(cè)(REST API版本)
但如何才能綁定這些賬號(hào)呢?經(jīng)過(guò)大量的搜尋,終于在REST API中找到一些蹤跡
http://docs.parseplatform.org/rest/guide/#linking
示例代碼中,演示如何用REST API綁定facebook賬號(hào),雖然沒(méi)有提到支持微信,但根據(jù)parse server在github代碼證據(jù)可以猜測(cè)微信也能行得通。
參照源碼:
https://github.com/parse-community/parse-server/blob/master/src/Adapters/Auth/wechat.js
對(duì)請(qǐng)求進(jìn)行如下修改:
- 需要將類型由示例代碼中的facebook改為wechat(根據(jù)代碼的文件的明明猜測(cè)如此,經(jīng)過(guò)驗(yàn)證后也確實(shí)為wechat)
- wechat的值中兩個(gè)字段是必須的
- id,微信的openid
- access_token,微信的access_token。
另外:
- curl要put到的地址填寫為你真實(shí)的地址
- X-Parse-Application-Id,你的APP_ID
- X-Parse-REST-API-Key,你的MASETER_KEY
- X-Parse-Session-Token,有效的session token(可以從dashboard的Session中找)
- curl要請(qǐng)求的地址,填寫為http://your_parse_server/parse/users/user_object_id, user_object_id需要是X-Parse-Session-Token的用戶id
修改后示例:
curl -X PUT \
-H "X-Parse-Application-Id: YOUR_APP_ID" \
-H "X-Parse-REST-API-Key: YOUR_MASTER_KEY" \
-H "X-Parse-Session-Token: r:32d5839c5cb973927680a30c0e8e1a2c" \
-H "Content-Type: application/json" \
-d '{
"authData": {
"wechat": {
"id": "your_openid",
"access_token": "t9kYDaf1-vjBmYm4SbtwrehYOMa0Oe-iPDrRgfQ5uIUrAI-rqpgGdSk0KZbNvqgAMaqtgbm-xPz51baqq7IEuA"
}
}
}' \
http://yourhost:1337/parse/users/1jhp70s6M8
微信登陸和注冊(cè)(JS版本)
注冊(cè)和登陸 | SIGNING UP AND LOGGING IN
假如已經(jīng)完成了微信的第三方登陸授權(quán),獲得對(duì)應(yīng)openid和access_token,就可以通過(guò)_linkWith方法做到自動(dòng)注冊(cè)(如果不存在綁定此openid的賬號(hào)會(huì)注冊(cè))和登陸(如果已經(jīng)存在則直接登陸),這也意味著通過(guò)_linkWith方法可以自動(dòng)創(chuàng)建和登陸Parse賬號(hào)。
關(guān)于_linkWith方法,見
http://docs.parseplatform.org/js/guide/#signing-up-and-logging-in
對(duì)應(yīng)_linkWith這個(gè)函數(shù)的下劃線有些好奇,是特意為止還是代碼缺陷?不過(guò)沒(méi)時(shí)間管了,因?yàn)槌嗣诌€有大坑!
大坑在哪?
坑在按照官方的文檔無(wú)論如何都成功不了,另外加上網(wǎng)上的資料幾乎為零,國(guó)外的網(wǎng)站大部分是登陸facebook或者twitter,對(duì)登陸國(guó)內(nèi)的微信之類的遇到的不是同類問(wèn)題。國(guó)內(nèi)又沒(méi)有相關(guān)的案例(可能是Parse這個(gè)名字對(duì)搜索引擎不友好)
當(dāng)前該文檔和js sdk的具體行為不一致,實(shí)際使用時(shí)發(fā)現(xiàn)_linkWith的第二個(gè)參數(shù)需要“包”一層,否則會(huì)拼接成錯(cuò)誤的格式,這個(gè)錯(cuò)誤還是對(duì)比rest api版本的_linkWith時(shí)發(fā)現(xiàn)的,要不是rest api成功過(guò)肯定會(huì)再次放棄。
源文檔中錯(cuò)誤的代碼示例:
let myAuthData = {
//...
}
let user = new Parse.User();
user._linkWith('twitter', myAuthData).then(function(user){
// user
});
修正后的代碼示例
var myAuthData = {
authData:{
// 根據(jù)具體的類型,決定該字段需要填寫哪些參數(shù),比如微信需要填寫id(值應(yīng)當(dāng)是微信的openid)和access_token
id: "your_wechat_openid",
"access_token": "your_access_token",
}
}
let user = new Parse.User();
user._linkWith('wechat', myAuthData).then(function(user){
// user
});
綁定 | LINKING
并不是所有的微信用戶都是新用戶。如果用戶已經(jīng)有了Parse賬戶,希望也能通過(guò)微信登陸,那需要的就需要綁定。從使用上和“注冊(cè)和登陸 | SIGNING UP AND LOGGING IN”是完全一樣的,唯一的區(qū)別在于:
- 不是:用new Parse.User()
- 而是:使用已經(jīng)登陸的用戶實(shí)例,比如Parse.User.current();
完整代碼:
var myAuthData = {
authData:{
// 根據(jù)具體的類型,決定該字段需要填寫哪些參數(shù),比如微信需要填寫id(值應(yīng)當(dāng)是微信的openid)和access_token
id: "your_wechat_openid",
"access_token": "your_access_token",
}
}
var user = Parse.User.current(); // 已經(jīng)登陸的user
user._linkWith('wechat', myAuthData).then(function(user){
// user
});
解除綁定 | UNLINKING
又一大坑,v1.10.0版本的js sdk,綁定還可以通過(guò)改改使用方式繞過(guò),而解綁連繞過(guò)的辦法都沒(méi)有?。。?/p>
被迫找找到舊版本的sdk嘗試,終于在v1.9.0-rc2發(fā)現(xiàn)可以通過(guò)類似綁定和解綁的方式繞過(guò)bug,解除綁定
代碼示例
var myAuthData = {
authData:null
}
var user = Parse.User.current();
user._linkWith('wechat', myAuthData).then(function(user){
// user
});