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)行二次開(kāi)發(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)行如下修改:
- 需要將類(lèi)型由示例代碼中的facebook改為wechat(根據(jù)代碼的文件的明明猜測(cè)如此纤垂,經(jīng)過(guò)驗(yàn)證后也確實(shí)為wechat)
- wechat的值中兩個(gè)字段是必須的
- id矾策,微信的openid
- access_token,微信的access_token峭沦。
另外:
- curl要put到的地址填寫(xiě)為你真實(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)求的地址蓬豁,填寫(xiě)為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方法,見(jiàn)
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)的微信之類(lèi)的遇到的不是同類(lè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ù)具體的類(lèi)型,決定該字段需要填寫(xiě)哪些參數(shù)圣拄,比如微信需要填寫(xiě)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ù)具體的類(lèi)型,決定該字段需要填寫(xiě)哪些參數(shù)执解,比如微信需要填寫(xiě)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ò)類(lèi)似綁定和解綁的方式繞過(guò)bug,解除綁定
代碼示例
var myAuthData = {
authData:null
}
var user = Parse.User.current();
user._linkWith('wechat', myAuthData).then(function(user){
// user
});