打通百度小程序登錄授權流程任督二脈


 

 

手百小程序登錄授權流程

智能小程序可以通過百度官方提供的登錄能力方便地獲取百度提供的用戶身份標識,快速建立智能小程序內的用戶體系。

 

1、 調用 swan.login() 獲取 臨時登錄憑證code,並回傳到開發者服務器;
2、 開發者服務器以 code 換取 session_key;
3、 調用 swan.getUserInfo() 獲取用戶信息。

 

使用百度授權前准備:
您需要創建一個智能小程序以獲取client_id(AppKey)和client_secret(AppSecret),以上兩者均從智能小程序開發者后台查看。

流程示意圖

概念介紹:
  • OAuth 2.0(開放授權):一個開放登錄授權標准。用戶授權后,第三方智能小程序無需獲取用戶的用戶名和密碼就可以訪問該用戶。
  • Session Key:用戶對智能小程序的授權會話的密鑰。用戶授權后,開發者可以通過百度開放平台獲取授權會話的Session Key,此后便可在智能小程序中獲取用戶信息。為了應用自身的數據安全,開發者服務器不應該把會話密鑰下發到小程序,也不應該對外提供這個密鑰。可以理解成Session Key就是用來獲取用戶信息的一個必要參數。
  • Code:用戶授權的標識。在用戶完成對應用的授權后,會生成一個很短時間(十分鍾)內有效的授權標識,開發者通過服務端請求,將code以及智能小程序的client_id和secret_key傳到開放平台接口,可以獲取到SessionKey。
以下是智能小程序使用OAuth 2.0進行授權及獲取用戶信息的示意圖:

 

1、 智能小程序在App內部運行時使用 swan.login()接口獲取Authorization Code;
2、 通過 Authorization Code 獲取  Session Key;
3、 調用 getUserInfo獲取用戶信息;
4、 當用戶完成了授權,且授權會話仍處於有效期時,智能小程序不需要每次都進行前兩步,而是可以直接進行第三步獲取用戶信息。
要判斷當前用戶的授權會話是否仍處於有效期,可調用 checkSession()方法進行判斷,詳見 下載小程序支付demo

會話密鑰Session Key有效性說明

開發者基於Session Key 進行信息解密過程中,如果突然開始出現解密失敗情況,請關注下面幾個與 Session Key有關的注意事項。
1、 Session key是具有時效性的,過期的Session Key將無法使用。開發者在 Session Key 失效時,需要通過重新執行登錄流程獲取有效的Session Key。
2、 使用 checkSession()可以校驗 Session Key 是否有效,從而避免小程序反復執行登錄流程,參考 授權流程圖中checkSession()使用。
3、 智能小程序不會把 Session Key 的有效期告知開發者。我們會根據用戶使用小程序的行為對 Session Key 進行續期。用戶越頻繁使用小程序, Session key 有效期越長。

 

swan.login

解釋: 調用接口 swan.login 獲取 Authorization Code,智能小程序可以使用swan.login()接口獲取Authorization Code。

 

swan.login({
    success: res => {
        swan.request({
            url: 'https://xxx/xxx', // 開發者服務器地址
            data: {
                code: res.code
            }
        });
    },
    fail: err => {
        console.log('login fail', err);
    }
});

 

 

Session Key

解釋: 智能小程序在其服務端中發送POST請求到百度 OAuth2.0 授權服務地址,並帶上對應的參數,便可獲取到Session Key。
獲取Session Key的URL地址:

 

為了讓您的智能小程序運行在聯盟 App 上,我們對獲取 SessionKey 的接口做了升級。新接口可以兼容獲取百度內部 App 和百度外部 App 的 SessionKey。
您只需要將原接口地址 " https://openapi.baidu.com/nalogin/getSessionKeyByCode" 更改為 " https://spapi.baidu.com/oauth/jscode2sessionkey" ,即可讓您的智能小程序在其它App上自動實現賬號關聯。
獲取Session Key需要的參數:

 

 

請求示例:

 

swan.checkSession

通過上述接口獲得的用戶登錄態擁有一定的時效性,用戶越久未使用智能小程序,用戶登錄態越有可能失效;反之如果用戶一直在使用智能小程序,則用戶登錄態一直保持有效。具體時效邏輯由宿主維護,對開發者透明。開發者可以調用 swan.checkSession 接口 檢測當前用戶登錄態是否有效,登錄態過期后開發者可以再調用 swan.login 獲取新的用戶登錄態。

 

 

Demo代碼( 在百度APP版本11.16(不包括11.16)之前建議按照如下示例使用)

swan.checkSession({
    success: function (res) {
        swan.showModal({
            title: '',
            content: '用戶在小程序中 登錄態有效'
        });
        if(!res.result){
            swan.showModal({
                title: '',
                content: '用戶在小程序中 登錄態無效,調用swan.login可獲取有效Session Key',
            });
            swan.login({
                success: res => {
                    console.log('login success', res);
                },
                fail: err => {
                    console.log('login fail', err);
                }
            });
        }
    },
    fail: function (err) {
        swan.showModal({
            title: '',
            content: '用戶在小程序中 登錄態無效,請先 登錄百度APP',
        });
        swan.login({
            success: res => {
                console.log('login success', res);
            },
            fail: err => {
                console.log('login fail', err);
            }
        });
    }
});

 

Demo代碼( 在百度APP版本11.16(包括11.16)之后建議按照如下示例使用)

Page({
    swan.checkSession({
        success: function (res) {
            swan.showModal({
                title: '',
                content: '用戶在小程序中 登錄態有效'
            });
        },
        fail: function (err) {
            swan.showModal({
                title: '',
                content: '用戶在小程序中 登錄態無效,調用swan.login可獲取有效 登錄態',
            });
            swan.login({
                success: res => {
                    console.log('login success', res);
                },
                fail: err => {
                    console.log('login fail', err);
                }
            });
        }
    });
});

 

swan.isLoginSync

基礎庫 1.13.4 版本開始支持。
 

 

<view class="wrap">
    <button type="primary" bindtap="isLoginSync">isLoginSync</button>
</view>

 

Page({
    isLoginSync() {
        try {
            var result = swan.isLoginSync();
            console.log('isLoginSync', result);
        } catch (e) {
            console.log('error', e);
        }
    }
});

 

 最后使用swan.getUserInfo方法獲取用戶的信息就可以了。

官方文檔:https://smartprogram.baidu.com/docs/develop/fuctionlist/list/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM