隐藏

利用Signalr实现手机端App扫码登录web页面

发布:2020/11/16 16:46:16作者:管理员 来源:本站 浏览次数:1759

实现原理:

1、web登录页面,利用jquery.qrcode展示一个随机生成的登录码的二维码;

2、手机App扫描二维码取得登录码

3、手机App将本地用户id+登录码通过api提交服务器;

4、服务器api,收到手机App请求,根据用户id+登录码,修改用户信息,同时将用户id+登录码广播;

5、web登录页面收到用户id+登录码,先本地验证登录码是否一致,然后向服务器验证用户id+登录码,验证成功跳转到指定页面。

6、完成扫码登录。

模拟web登录页面代码:


  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="Generator" content="EditPlus®">
  6. <meta name="Author" content="">
  7. <meta name="Keywords" content="">
  8. <meta name="Description" content="">
  9. <title>扫码登录测试</title>
  10. </head>
  11. <body>
  12. <script src="http://***/Scripts/jquery-1.10.2.min.js"></script>
  13. <script src="http://***/Scripts/jquery.signalR-2.4.1.min.js"></script>
  14. <script src="http://***/Scripts/jquery.qrcode.min.js"></script>
  15. <script src="http://***/Signalr/hubs"></script>
  16. <div id="qrcode"><canvas width="256" height="256"></canvas></div>
  17. <script type="text/javascript">
  18. jQuery.support.cors=true;
  19. var SignalrHub=$.connection.hub;
  20. $(function(){
  21. var loginCode=guid();
  22. //生成登录码二维码
  23. jQuery('#qrcode').qrcode(loginCode);
  24. console.log(loginCode);
  25. SignalrHub.url="http://***/Signalr/hubs";//服务器端Singnalr hub 路径
  26. var hubClient=$.connection.messageHub.client;
  27. hubClient.ShowMessage=function(msg)
  28. {
  29. var jsonMsg= $.parseJSON(msg);
  30. if(jsonMsg && jsonMsg.loginCode==loginCode)
  31. {
  32. //向服务器验证用户id+登录码
  33. if(server.CheckLoginCode(jsonMsg.UserId,jsonMsg.loginCode))
  34. {
  35. alert("登录成功!");
  36. top.location.reload();//跳转到需要的页面
  37. }
  38. }
  39. }
  40. SignalrHub.start();
  41. //SignalrHub.stop()
  42. });
  43. //生成仿Guid字符串
  44. function guid() {
  45. return 'ecbxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
  46. var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
  47. return v.toString(16);
  48. });
  49. }
  50. </script>
  51. </body>
  52. </html>

 

模拟服务器代码:


  1. //app设置用户登录码接口
  2. public string SetLoginCode(string userId,string loginCode)
  3. {
  4. //todo 设置登录码
  5. //广播消息
  6. var hub = GlobalHost.ConnectionManager.GetHubContext<MessageHub>();
  7. hub.Clients.All.ShowMessage(userId+loginCode);//也可以定向广播
  8. //web验证登录码接口
  9. public bool CheckLoginCode(string userId,string loginCode)
  10. {
  11. //todo 验证登录码
  12. //todo 验证成功 清除或者更改登录码
  13. return true