前后端分离 github登录(Oauth2)

前后端分离 github登录(Oauth2)

第三方登录在前后端不分离的情况下实现比较简单,在前后端分离情况下思路相同但是实现相对复杂。

复杂点:

  • 生成token
  • 把token和用户数据给前端页面

第一点如果熟悉token、JWT并不算复杂,主要是第二点容易卡住,需要应用前端知识。

将token和用户数据给前端

可能没有试过的同学不知道难在哪里,看一下登录逻辑图就知道难在哪了。

在这里插入图片描述

后端想返回数据可是前端没有监听后端的响应,前端只能获取GitHubAPP的响应,但是没有。

那如何做呢?

具体实现:前端

前端 vue

github_login() {
      var githubUrl =
        "githubapp url";

      // 弹出 500 * 500 的窗口
      window.open(
        githubUrl,
        "newwindow",
        "height=500, width=500, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=n o, status=no"//style不重要
      );

      // 通过监听小窗口,父页面可以拿到子页面(小窗口)发送给父页面的消息,父(前端页面),子(小窗)
      window.addEventListener(
        "message",//监听事件类型
        function (e) {//e里面有我们需要的数据
          console.log(e.data);//打印看一下有没有的到
        },
        false
      );
    },

参考https://www.jianshu.com/p/da54bad42b30,感谢!

但是主要后端return的数据window.addEventListener监听不到!!!

后端给的数据会显示在小窗上,但那个数据小窗口没有发送!!!

注释写了,父页面监听子页面发送给父页面的消息。

如何发送!通过JavaScript!

所以后端应该返回到一个中间页面或者返回html!

具体实现:后端

后端部分代码

public String githubLogin(@RequestParam("code")String code, @RequestParam("state")String state) throws Exception {
        String accessToken = gitHubLoginProvider.getAccessToken(code);//获得github_token
        GitHubUserDTO gitHubUserDTO= gitHubLoginProvider.getUserInfo(accessToken);//获得user_message gitHubLoginProvider.getUserInfo(accessToken)是封装的函数,大家在写的时候自己封装一下,或者等下一篇博客(doge)
        UserAuths userAuths=userAuthsService.getOneByUserIdAndIdentityType(gitHubUserDTO.getId(),2);//封装到自己的实体类
        String token= JwtUtils.createTokenNow(gitHubUserDTO.getId(),2);//生成自己的token
 		//返回的数据
        Map<String,String> result=new HashMap<>();
        result.put("token",token)// vue前端获取这个数据,去登录。
        String html = "<head>\n" +
                "  <meta charset=\"UTF-8\">\n" +
                "</head>\n" +
                "<body>\n" +
                "   <p style=\"text-align: center;\"><h3>登录中....</h3></p>\n" +
                "</body>" +
                "\n" +
                "<script>\n"+
                "  window.οnlοad=function () {\n" +
                "    var message =" + JSONUtil.toJsonStr(result) + ";\n" +
                "    window.opener.postMessage(message, 'http://localhost:8089/bbs/login');\n" +//url是父页面的url
                "    window.close();\n" +
                "  }\n" +
                "</script>\n"+
                "\n";
        return html;
    }

window.opener.postMessage是JavaScript发送消息的函数。

这个window可以理解成小窗口运行这段html+JavaScript,再打开一个小窗口,在小窗口的小窗口发消息给父页面,总之这样就可以接收到token了。

我对js并不了解只是会用,如有错误欢迎指正。

参考:

https://www.jianshu.com/p/da54bad42b30

码匠笔记

感谢

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在前后分离的单点登录中,我们可以采用一些方法来解决一些问题。首先,我们可以使用token来代替全局的明文传递的URL。通过在用户登录后生成一个token,并将其存储在后,然后将该token返回给前,前在进行请求时携带该token进行验证。这样做可以避免直接在URL中传递token,增加了安全性。 其次,在前后分离的情况下,前已经不存在session会话了,因此可以考虑使用cookie来存储登录信息。在用户登录成功后,将相关信息存储在cookie中,并设置cookie的安全属性,如httponly和secure,以增加安全性。对于内网项目,可以不考虑https协议,但对于外网项目,必须使用https协议来保护cookie的安全性。 以上是在前后分离的单点登录中解决问题的一些方法,可以根据具体情况选择适合的方法来实现单点登录功能。具体的实现细节可以参考相关的源码,如https://github.com/xjs1919/enumdemo下的sso-static。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [前后分离如何做SSO单点登录?](https://blog.csdn.net/goldenfish1919/article/details/100169368)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [前后分离 单点登录SSO 纯前实现单点登录SSO](https://blog.csdn.net/fay462298322/article/details/54963716)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值