uniapp登錄微信小程序
一 小程序服務(wù)端文檔鏈接
https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getStableAccessToken.html
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
二 登錄流程時(shí)序?yàn)?/p>
小程序 wx.login()獲取code
小程序 wx.request()發(fā)送code 開發(fā)者服務(wù)器
開發(fā)者服務(wù)器 登錄憑證校驗(yàn)接口 appid+appsecret+code 微信接口服務(wù)
微信接口服務(wù) 返回session_key+openid等 開發(fā)者服務(wù)器
開發(fā)者服務(wù)器 自定義登錄態(tài) 與openid,session_key關(guān)聯(lián)
開發(fā)者服務(wù)器 返回自動(dòng)以登錄態(tài) 小程序
小程序 自定義登錄態(tài) 存入storage
小程序 wx.request()發(fā)起業(yè)務(wù)請(qǐng)求 攜帶自定義登錄態(tài)
開發(fā)者服務(wù)器 通過自定義登錄態(tài) 查詢openid和session_key
開發(fā)者服務(wù)器 返回業(yè)務(wù)數(shù)據(jù)
說明:
前端調(diào)用 wx.login() 獲取 臨時(shí)登錄憑證code ,并回傳到開發(fā)者服務(wù)器。
后端調(diào)用 auth.code2Session 接口,換取 用戶唯一標(biāo)識(shí) OpenID 、 用戶在微信開放平臺(tái)帳號(hào)下的唯一標(biāo)識(shí)UnionID(若當(dāng)前小程序已綁定到微信開放平臺(tái)帳號(hào)) 和 會(huì)話密鑰 session_key。
注意事項(xiàng):
會(huì)話密鑰 session_key 是對(duì)用戶數(shù)據(jù)進(jìn)行 加密簽名 的密鑰。為了應(yīng)用自身的數(shù)據(jù)安全,開發(fā)者服務(wù)器不應(yīng)該把會(huì)話密鑰下發(fā)到小程序,也不應(yīng)該對(duì)外提供這個(gè)密鑰。
臨時(shí)登錄憑證 code 只能使用一次
三 其他項(xiàng)目解決方案
需要傳token的接口統(tǒng)統(tǒng)在header中加
Authorization? ?
terminalType 1:iOS,2:安卓? ??
version版本號(hào)
header中添加Authorization帶token值,獲取員工信息
即小程序request的header改為
header: {'content-type':'application/json', 'Authorization': token},
注:fastadmin做后端的話,Authorization關(guān)鍵詞改為token
四 uniapp登錄思路
1 前端獲取code?
2 后端獲取OpenID?
3 后端注冊(cè) 方法在FASTADMIN的auth類
4 后端登錄 返回userinfo,其中有token
5 前端獲取userinfo,存入globalData改變登錄狀態(tài)
6 header中聲明token進(jìn)行前后端交互
五 前臺(tái)小程序源生登錄
wx.login方法會(huì)返回用戶登錄憑證(有效期五分鐘)。
開發(fā)者需要在開發(fā)者服務(wù)器后臺(tái)調(diào)用 code2Session,使用 code 換取 openid、unionid、session_key 等信息
```
wx.login({
? success (res) {
? ? if (res.code) {
? ? ? //發(fā)起網(wǎng)絡(luò)請(qǐng)求
? ? ? wx.request({
? ? ? ? url: 'https://example.com/onLogin',
? ? ? ? data: {
? ? ? ? ? code: res.code
? ? ? ? }
? ? ? })
? ? } else {
? ? ? console.log('登錄失??!' + res.errMsg)
? ? }
? }
})
```
六 后臺(tái)jscode2session接口根據(jù)code,獲取unionid等
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code?
七 uniapp封裝的登錄方法
文檔鏈接:
https://uniapp.dcloud.net.cn/api/plugins/login.html
```
uni.login({
? provider: 'weixin', //使用微信登錄
? success: function (loginRes) {
? ? console.log(loginRes.authResult);
? }
});
```
八 后端FASTADMIN的登錄認(rèn)證
FASTADMIN使用了基于Auth驗(yàn)證的權(quán)限管理系統(tǒng)
配置項(xiàng)路徑為:
application\common\controller\backend.php 里的 protected $dataLimit
相關(guān)表為:
auth_group
auth_rule
引用:
use app\common\library\Auth;
注冊(cè):
$auth = new Auth();
$auth ->register('test', 'test123456789');
九 auth、token、cookie、session等
1 this->auth是保存在服務(wù)器端的,類似session
2 token是保存在客戶端的,類似cookie
3 auth是每次api訪問后生成的,里邊保存包括用戶的信息.
4 session和cookie是本次訪問本臺(tái)服務(wù)器記錄下來的會(huì)話信息,無法用于api接口開發(fā)方式,因?yàn)槊恳淮握?qǐng)求都會(huì)是新的session 會(huì)導(dǎo)致本次存儲(chǔ)的session和上次的不一樣,到時(shí)候會(huì)讀不到你想要的.
5 token是用戶登錄后生成的,也可以是其它途徑生成.token生成后會(huì)存入數(shù)據(jù)庫(對(duì)于fastadmin來說,是這樣實(shí)現(xiàn)的,一個(gè)用戶有多個(gè)token),在訪問api的時(shí)候,fastadmin會(huì)通過token來獲取用戶信息.
十 論壇查詢token相關(guān)問答
關(guān)于fastadmin后臺(tái)操作檢測(cè)權(quán)限使用說明
頁面
? ? <table id="table" class="table table-striped table-bordered table-hover"?
? ? ? ? ? ?data-operate-edit="{:$auth->check('user/user/edit')}"?
? ? ? ? ? ?data-operate-del="{:$auth->check('user/user/del')}"?
? ? ? ? ? ?width="100%">
? ? </table>
基類文件路徑:
app\common\backend.php
引用Auth:
use app\admin\library\Auth;
初始化auth:
$this->auth = Auth::instance();
app\admin\library\Auth繼承于extend/fast/Auth類
$uid加載獲取登錄的賬號(hào)所有權(quán)限
$uid = $uid ? $uid : $this->id
因?yàn)橐肓薬dmin模型
use app\admin\model\Admin;
$uid = $uid ? $uid : $this->id
在登錄成功時(shí)候會(huì)把用戶信息進(jìn)行寫入session
通過TP自動(dòng)調(diào)用魔術(shù)方法__get獲取admin成員屬性
直接訪問$this->id就是去找admin模型的屬性。
十一 改造user表
新增openid
新增unionid
php think crud -t adminuser -u -f 1
十二 api中新增方法jscode2session
```
public function jscode2session()
{
? ? ? ? $jscode = $this->request->get("jscode");
? ? ? ? $url = "https://api.weixin.qq.com/sns/jscode2session";
? ? ? ? $res = Http::sendRequest($url); //array類型 直接返回報(bào)錯(cuò) $res = json_encode($res);
? ? ? ? $msg = $res['msg']; //string類型
? ? ? ? $msg = json_decode($msg, true);
? ? ? ? $openid = '';
? ? ? ? if($msg['openid']){
? ? ? ? ? ? $openid = $msg['openid'];
? ? ? ? ? ? //api登錄拷貝自u(píng)ser.php。在app/common/library/Auth.php中新增loginbyopenid
? ? ? ? ? ? $ret = $this->auth->loginByOpenid($openid);?
? ? ? ? ? ? if ($ret) {
? ? ? ? ? ? ? ? $data = ['userinfo' => $this->auth->getUserinfo()];
? ? ? ? ? ? ? ? return json_encode($data);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? return "注冊(cè)失敗";
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? else{
? ? ? ? ? ? return "登錄失敗";
? ? ? ? }
? ? }
```
十三 auth類中新增方法loginByOpenid
略 修改自原有的注冊(cè)和登錄方法
十四 uniapp新增小程序登錄
1 先獲取系統(tǒng)類型
uni.getSystemInfo
2 調(diào)用登錄方法
uni.login
3 回調(diào)中調(diào)用后端注冊(cè)登錄方法
uni.request
4 以上部分是異步方法,最終的回調(diào)中同步存入本地并更新數(shù)據(jù)
uni.setStorageSync
十五 上傳和修改頭像
前端上傳使用
uni.uploadFile
新建方法
```
? ? public function upload_avatar()
? ? {
? ? ? ? $user = $this->auth->getUser();
? ? ? ? $avatar = $this->request->file('image');
? ? ? ? $info = $avatar->move(ROOT_PATH . 'public' . DS . 'uploads');
? ? ? ? if($info){
? ? ? ? ? ? // 成功上傳后 獲取上傳信息
? ? ? ? ? ? //$info = $info->getExtension(); // 輸出文件類型
? ? ? ? ? ? $info = $info->getSaveName();//輸出 20160820/42a79759f284b767dfcb2a0197904287.jpg
? ? ? ? ? ? //$info = $info->getFilename();// 輸出 42a79759f284b767dfcb2a0197904287.jpg
? ? ? ? }else{
? ? ? ? ? ? // 上傳失敗獲取錯(cuò)誤信息
? ? ? ? ? ? $info = $file->getError();
? ? ? ? }
? ? ? ? return $info;
? ? }
```