微信賬號(hào)登陸Parse

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)行如下修改:

  1. 需要將類型由示例代碼中的facebook改為wechat(根據(jù)代碼的文件的明明猜測(cè)如此,經(jīng)過(guò)驗(yàn)證后也確實(shí)為wechat)
  2. 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
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容