<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      在Blazor實現微信小程序掃碼登錄

      在Blazor實現微信小程序掃碼登錄

      ——使用極簡登錄模型

      最近需要開發一個Blazor Server Side頁面,需要用到登錄功能,作為某微信小程序的后管。在網上搜了一遍,似乎沒有找到合適的,所以就自己造了個輪子。幾乎都是代碼,從來不需要寫注釋的我。

      • 本文示例后端代碼在.NET 6,下用Minimal Api實現。
      • 我是CHARSET,轉載請保留全文本。

      1. Blazor前端顯示二維碼

      GitHub上隨便找了個組件,名字是BlazorZXingJs。使用方法也非常簡單。將組件放入<NotAuthorized>標簽內部。

       <QRCodeWriter Text="@Code" Width="200" Heigth="200" @ref="writer" />
      

      如果需要每隔一段時間生成,則更換Code的值即可。

      2. 使用SignalR將ConnectionId從后端傳給Blazor前端

      在后端SignalR.Hub接受每次連接時傳回
      public override async Task OnConnectedAsync() {
        await Clients.Caller.SendAsync("ConnectionId", Context.ConnectionId);
        await base.OnConnectedAsync();
      }
      
      Blazor前端接收到ConnectionId
      hubConnection.On<string>("ConnectionId", id => connectionId = id);
      
      需要注意到的是,Blazor前端在收到此Id后才顯示二維碼
      if (!string.IsNullOrEmpty(connectionId)) {
        code = Guid.NewGuid().ToString();
        Membership.RegisterScanCode(code);
        Code = $"{code}|{connectionId}";
        InvokeAsync(StateHasChanged);
      }
      

      為了簡單起見,Code使用上述邏輯生成。圖像識別的結果是注冊的二維碼CodeconnectionId

      3. 小程序解析快速響應碼(QRCode)

      function OnQRLogin() {
        wx.scanCode({ onlyFromCamera: true, scanType: ['qrCode'],
          success: function (res) {
            const split = res.result.split('|')
            wx.request({
              url: `${host}/e/${token}/${split[0]}/${split[1]}`,
              success: function (rt) {
                if (rt.data && rt.data.success) {
                  wx.showModal({ title: '成功', content: '請注意登錄頁面是否成功的信息', icon: 'success' })
                }
              }
            })
          }
        })
      }
      

      4. 后端服務根據ConnectionId將Token和二維碼Code回送給Blazor前端

      application.MapGet("/e/{token}/{recog}/{cid}", async Task<SimpleResponse> 
                         (string token, string recog, string cid, [FromServices] ChatHubHelper hub) => {
        var response = new SimpleResponse();
        await hub.SendRequest(cid, new LoginRequest { ScanCode = recog, Token = token });
        response.Success = true;
        return response;
      });
      

      5. Blazor前端收到此回執后正常使用極簡模型登錄

      hubConnection.On<LoginRequest>("LoginRequest", async request => {
        connectionId = "已掃描,請靜待結果……";
        var response = await AuthStateProvider.Login(request);
        if (response.Success) {
          Membership.UnRegisterScanCode(code);
          await Message.Success("登錄成功");
        } else {
          await Message.Warn(response.Message);
        }
        await InvokeAsync(StateHasChanged);
      });
      

      初版在2022年3月17日寫

      posted @ 2022-03-17 21:13  charset  閱讀(2406)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 莎车县| 欧美人禽杂交狂配| 日韩有码中文字幕国产| 日本国产精品第一页久久| av天堂亚洲天堂亚洲天堂| 亚洲第一香蕉视频啪啪爽| 亚洲春色在线视频| 无遮无挡爽爽免费视频| 久久精品一本到99热免费| gogogo高清在线观看视频中文| 正在播放肥臀熟妇在线视频| 久久久国产精品樱花网站| 乱码午夜-极品国产内射| 国产综合久久99久久| 久久国产精品福利一区二区三区| 人体内射精一区二区三区| 国产中文字幕精品免费| 国产95在线 | 欧美| 日韩深夜视频在线观看| 国产另类ts人妖一区二区| 性男女做视频观看网站| 少妇内射高潮福利炮| 亚洲成人av在线系列| 午夜福利免费视频一区二区| 成人精品区| 亚洲国产精品成人av网| 国产成人无码aa精品一区| 国产精品中出一区二区三区| 亚洲成a人片在线观看日本 | 午夜射精日本三级| 久久久久人妻精品一区三寸| 色偷偷女人的天堂亚洲网| 久久综合久中文字幕青草| 亚洲性猛交xxxx| 18av千部影片| 一级做a爰片久久毛片下载| 亚洲人成网站在线播放2019| 久热久热中文字幕综合激情| 国产精品自在自线免费观看| 午夜色大片在线观看免费| 少妇人妻偷人免费观看|