植物百科网
当前位置: 首页 农业百科

github远程即时开发(快速接入GitHubQQ)

时间:2023-07-30 作者: 小编 阅读量: 1 栏目名: 农业百科

但是忽略该参数是会导致CSRF攻击的,在回调函数中应当对该字段进行校验!最后我的解决办法是使用redis缓存,使用set存储,回调时判断是否存在。"param);}1.4Github回调方法在上一步中,浏览器会被跳转到Github的授权页,当用户登录并点击确认后,GitHub认证服务器会跳转到我们填写的回调URL中,我们在程序中处理回调。在回调方法中,步骤如下:1.首先验证state与发送时是否一致,如果不一致,可能遭遇了CSRF攻击。

本文提及第三方登录涉及到 OAuth2.0,关于 OAuth2.0 的理论基础参考阮一峰老师的《理解 OAuth 2.0》,其中关于授权码模式就是本篇文章的重点,如想看这篇理论基础自行百度即可。

一、GitHub 登录

1.1 注册应用

进入 Github 的 Setting 页面,点击 Developer settings,如图所示:

进入后点击 New Oauth App,如图所示:

在其中填写主页 URL回调 URL,回调 URL 尤为重要,如果不太明白可以先和我一致。

点击注册后,上方会生成 Client IDClient Secret,这两个后面要用到。

1.2 HTML 页面

页面十分简单,只有两个跳转链接:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>三方登录</title></head><body><h1>三方登录Demo</h1><div><a href="/githubLogin">GitHub登录</a><a href="/qqLogin">QQ登录</a></div></body></html>

1.3 Github 登录方法

在这个方法中,我们需要访问 GitHub 的认证服务器,使用 Get 请求,这里使用重定向来实现。

遵循 Oauth 2.0 规范,需要携带以下参数:

  • response_type:对于授权码模式,该值固定为code

  • client_id:注册应用时的 Client ID

  • state:回调时会原样返回

  • redirect_uri: 回调 URL,注册应用时填写的

这里的 state参数我要额外说明下,因为该参数会在后面的回调 URL 中被原样携带回来,绝大多数的开发者会忽略该字段,阮一峰老师的文章也没有着重提及这一点。但是忽略该参数是会导致 CSRF攻击的,在回调函数中应当对该字段进行校验!

关于如何校验,我一开始的想法是使用 session 来存储 state 进行校验的,但是我发现使用重定向后 session 不是同一个 session,方案一失败。

然后我想通过 ajax 请求,在页面中使用 window.location.href方法跳转到认证服务器,使用 session 存储,但是很不幸这样也不是同一个 session,方案二失败。

最后我的解决办法是使用 redis 缓存,使用 set 存储,回调时判断是否存在。当然你也可以用 HashMap 来存储,这也是一个解决办法。

关于 Redis,可以参考:https://jitwxs.cn/e331e26a.html

private static String GITHUB_CLIENT_ID = "0307dc634e4c5523cef2";private static String GITHUB_CLIENT_SECRET = "707647176eb3bef1d4c2a50fcabf73e0401cc877";private static String GITHUB_REDIRECT_URL = "http://127.0.0.1:8080/githubCallback";@RequestMapping("/githubLogin")public void githubLogin(HttpServletResponse response) throws Exception {// Github认证服务器地址String url = "https://github.com/login/oauth/authorize";// 生成并保存state,忽略该参数有可能导致CSRF攻击String state = oauthService.genState;// 传递参数response_type、client_id、state、redirect_uriString param = "response_type=code&""client_&state="state"&redirect_uri="GITHUB_REDIRECT_URL;// 1、请求Github认证服务器response.sendRedirect(url"?"param);}

1.4 Github 回调方法

在上一步中,浏览器会被跳转到 Github 的授权页,当用户登录并点击确认后,GitHub认证服务器会跳转到我们填写的回调URL中,我们在程序中处理回调。

在回调方法中,步骤如下:

1. 首先验证 state与发送时是否一致,如果不一致,可能遭遇了CSRF攻击。

2. 得到 code,向 GitHub 认证服务器申请令牌(token)

这一步使用模拟的 POST 请求,携带参数包括:

  • grant_type:授权码模式固定为authorization_code

  • code:上一步中得到的code

  • redirect_uri:回调URL

  • client_id:注册应用时的Client ID

  • client_secret:注册应用时的Client Secret

3. 得到令牌(access_token)和令牌类型(token_type),向GitHub资源服务器获取资源(以 user_info 为例)

这一步使用模拟的 GET 请求,携带参数包括:

  • access_token:令牌

  • token_type:令牌类型

4. 输出结果

/*** GitHub回调方法* @param code 授权码* @param state 应与发送时一致* @author jitwxs* @since 2018/5/21 15:24*/@RequestMapping("/githubCallback")public void githubCallback(String code, String state, HttpServletResponse response) throws Exception {// 验证state,如果不一致,可能被CSRF攻击if(!oauthService.checkState(state)) {throw new Exception("State验证失败");}// 2、向GitHub认证服务器申请令牌String url = "https://github.com/login/oauth/access_token";// 传递参数grant_type、code、redirect_uri、client_idString param = "grant_type=authorization_code&code="code"&redirect_uri="GITHUB_REDIRECT_URL"&client_&client_secret="GITHUB_CLIENT_SECRET;// 申请令牌,注意此处为post请求String result = HttpClientUtils.sendPostRequest(url, param);/** result示例:* 失败:error=incorrect_client_credentials&error_description=The client_id and/or client_secret passed are incorrect.&* error_uri=https://developer.github.com/apps/managing-oauth-apps/troubleshooting-oauth-app-access-token-request-errors/#incorrect-client-credentials* 成功:access_token=7c76186067e20d6309654c2bcc1545e41bac9c61&scope=&token_type=bearer*/Map<String, String> resultMap = HttpClientUtils.params2Map(result);// 如果返回的map中包含error,表示失败,错误原因存储在error_descriptionif(resultMap.containsKey("error")) {throw new Exception(resultMap.get("error_description"));}// 如果返回结果中包含access_token,表示成功if(!resultMap.containsKey("access_token")) {throw new Exception("获取token失败");}// 得到token和token_typeString accessToken = resultMap.get("access_token");String tokenType = resultMap.get("token_type");// 3、向资源服务器请求用户信息,携带access_token和tokenTypeString userUrl = "https://api.github.com/user";String userParam = "access_token="accessToken"&token_type="tokenType;// 申请资源String userResult = HttpClientUtils.sendGetRequest(userUrl, userParam);// 4、输出用户信息response.setContentType("text/html;charset=utf-8");response.getWriter.write(userResult);}

二、QQ 登录

2.1 注册应用

进入 QQ 互联管理中心:https://connect.qq.com/manage.html,创建一个新应用(需要先审核个人身份):

然后注册应用信息,和 GitHub 的步骤大差不差:

注册后,可以看到应用的 APP ID、APP Key,以及你被允许的接口,当然只有一个获取用户信息。

官方开发文档点击这里:

http://wiki.connect.qq.com/开发攻略_server-side

注意:审核状态为审核中和审核失败也是可以使用的,不用担心(只是无法实际上线而已,作为 Demo 足够了)。

2.2 QQ 登录方法

private static String QQ_APP_ID = "101474821";private static String QQ_APP_KEY = "00d91cc7f636d71faac8629d559f9fee";private static String QQ_REDIRECT_URL = "http://127.0.0.1:8080/qqCallback";@RequestMapping("/qqLogin")public void qqLogin(HttpServletResponse response) throws Exception {// QQ认证服务器地址String url = "https://graph.qq.com/oauth2.0/authorize";// 生成并保存state,忽略该参数有可能导致CSRF攻击String state = oauthService.genState;// 传递参数response_type、client_id、state、redirect_uriString param = "response_type=code&""client_&state="state"&redirect_uri="QQ_REDIRECT_URL;// 1、请求QQ认证服务器response.sendRedirect(url"?"param);}

2.3 QQ 回调方法

/*** QQ回调方法* @param code 授权码* @param state 应与发送时一致* @author jitwxs* @since 2018/5/21 15:24*/@RequestMapping("/qqCallback")public void qqCallback(String code, String state, HttpServletResponse response) throws Exception {// 验证state,如果不一致,可能被CSRF攻击if(!oauthService.checkState(state)) {throw new Exception("State验证失败");}// 2、向QQ认证服务器申请令牌String url = "https://graph.qq.com/oauth2.0/token";// 传递参数grant_type、code、redirect_uri、client_idString param = "grant_type=authorization_code&code="code"&redirect_uri="QQ_REDIRECT_URL"&client_&client_secret="QQ_APP_KEY;// 申请令牌,注意此处为post请求// QQ获取到的access token具有3个月有效期,用户再次登录时自动刷新。String result = HttpClientUtils.sendPostRequest(url, param);/** result示例:* 成功:access_token=A24B37194E89A0DDF8DDFA7EF8D3E4F8&expires_in=7776000&refresh_token=BD36DADB0FE7B910B4C8BBE1A41F6783*/Map<String, String> resultMap = HttpClientUtils.params2Map(result);// 如果返回结果中包含access_token,表示成功if(!resultMap.containsKey("access_token")) {throw new Exception("获取token失败");}// 得到tokenString accessToken = resultMap.get("access_token");// 3、使用Access Token来获取用户的OpenIDString meUrl = "https://graph.qq.com/oauth2.0/me";String meParams = "access_token="accessToken;String meResult = HttpClientUtils.sendGetRequest(meUrl, meParams);// 成功返回如下:callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );// 取出openidString openid = getQQOpenid(meResult);// 4、使用Access Token以及OpenID来访问和修改用户数据String userInfoUrl = "https://graph.qq.com/user/get_user_info";String userInfoParam = "access_token="accessToken"&oauth_consumer_key="QQ_APP_ID"&opentext/html;charset=utf-8");response.getWriter.write(userInfo);}/*** 提取Openid* @param str 形如:callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );* @author jitwxs* @since 2018/5/22 21:37*/private String getQQOpenid(String str) {// 获取花括号内串String json = str.substring(str.indexOf("{"), str.indexOf("}")1);// 转为MapMap<String, String> map = JsonUtils.jsonToPojo(json, Map.class);return map.get("openid");}

三、项目源码

QQ 登录的具体流程我就不啰嗦了,都差不多。代码只列出了关键方法,具体程序还包含工具类和 redis 的配置。具体请参考文章开头源码,该项目采用 SpringBoot 搭建,需要 Redis 支持。

文章作者: Jitwxs

文章链接: https://jitwxs.cn/33ad9e35.html

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jitwxs!

1.一份 Spring Boot 项目搭建模板

Spring Boot 实现应用监控和报警

3. Nginx 从入门到实战

一键式搭建分布式文件服务器

5.团队开发中 Git 最佳实践

,
    推荐阅读
  • 突触名词解释(突触是什么意思)

    突触名词解释突触是指一个神经元的冲动传到另一个神经元或传到另一细胞间的相互接触的结构。突触是神经元之间在功能上发生联系的部位,也是信息传递的关键部位。在光学显微镜下,可以看到一个神经元的轴突末梢经过多次分支,最后每一小支的末端膨大呈杯状或球状,叫做突触小体。这些突触小体可以与多个神经元的细胞体或树突相接触,形成突触。从电子显微镜下观察,可以看到,这种突触是由突触前膜、突触间隙和突触后膜三部分构成。

  • 《守望先锋》对战局影响大招top一览 守望先锋对局战绩

    今天小编要为大家带来的是玩家“黑呦酱”分享的《守望先锋》对战局影响大招top一览,感兴趣的玩家赶紧一起来看看吧!守望先锋大招分为四类,控制类,自身BUFF类,辅助类以及伤害类,由于伤害类大部分使用大招时,本体无法进行有效杀伤,且控制类及自身BUFF类需要其他技能的配合,so,此间因素也要加入考量。

  • 运动后喝黑咖啡还能燃脂吗 运动时喝黑咖啡会加快燃脂吗?

    2、运动过程中身体脂肪会加速燃烧,从而具有一定减肥作用;而黑咖啡热量比较小,加上其中含有大量的咖啡因以及维生素、纤维素物质,适量喝可以促进人体肠胃蠕动,加速脂肪代谢分解,对减肥具有促进作用。

  • 斯威汽车质量怎么样(斯威质量好不好)

    2018年6月起,斯威“品质特工队”以四大火炉的重庆作为起点,途径海南、吐鲁番、格尔木三地,历时近一年进行了数十万公里极限环境适应性试验。极端干燥高温环境下,常见车内温度往往会狂飙到60℃以上,而在斯威G01的车厢里,却始终能够保持清新凉爽的状态。一整套严酷考验下来,斯威G01的性能表现完全得以充分认证。这样一算,斯威G01差不多完成了近百万公里的专业级严酷考验。

  • 春天兰花怎么养 春天兰花怎么养浇水

    白墨兰花哪个品种最好白墨兰花是墨兰的珍贵变异品种假鳞茎椭圆形,已有数百年栽培历史,流传至今,不下十数个品种,它叶色莹润、体态优雅、幽香静远、且抗病,白墨兰花比较好的品种一般分企剑和软剑两个品系。什么兰花开花最香兰花品种很多,按花香来排,在兰花界春兰居首,惠兰次之,随后便是建兰、墨兰和寒兰,春兰的花香味最正宗,持久性也极强。

  • 奔驰e300l前进挡总共有几个(你看了奔驰22款E300L升级这套原厂HUD抬头显示效果觉得怎么样)

    从行车安全的角度来考虑,加装一台HUD是非常有必要的。HUD的全称是HeadUpDisplay,中文翻译过来就是抬头显示器。今天星骏汇小陈通过以上的产品配件图了解,我们看到这台奔驰22款E300L升级HUD抬头显示所需要更换的配件有,抬显仪器,高配仪表盖板,高配仪表电脑,雨量传感器,空调管升级HUD抬头显示把仪表台上的那一块盖板换掉,换成高配的预留好显示器孔位的盖板,装上显示器,从而使仪表显示的内容投射到挡风玻璃上面。

  • 儿童葫芦丝表演(通城千人共奏葫芦丝)

    儿童葫芦丝表演香城都市报讯 10月27日,通城县隽水中学参加湖北省“黄鹤杯”美育节节目视频录制现场,七、八年级千名学生,同奏乐曲《龙的传人》。该校相关负责人介绍,本学期,每天下午预备铃响5分钟,七、八年级各班集体合奏葫芦丝。丝竹声声,已渐成校园一道靓丽的风景线。近年来,该校贯彻落实社会主义核心价值观,注重未成年人思想道德建设,坚持开设中华传统和特色民族特色教育课程,促进学生“德智体”全面发展。

  • 鸡娃时代孩子的成长之道(与其1岁就开始鸡娃)

    出生时大脑发育已经完成25%,1岁完成了50%,3岁完成了60%,6岁达到90%。现在小学虽然是零基础入学,取消了统一考试,但是它对学生的要求并没有降低。吃够了佛系养娃的亏,橙子家的老二断然不肯再佛系养了。北京卫视于2018年摄制的纪录片《起跑线》中,有一个7岁的北京女孩令人印象深刻。她的家庭,在北京三环内有一套房,一辆车。妈妈认为,孩子从小培养兴趣,靠的是父母的指引。

  • 环氧树脂的作用与用途(环氧树脂有什么作用与用途)

    环氧树脂的作用与用途具有优良的物理和电绝缘性能,强度高、收缩性低,耐腐蚀以及有高绝缘的优势,所以被称为万能胶。电器、电机绝缘封装件的浇注。从常压浇注、真空浇注已发展到自动压力凝胶成型。长时间接触胶水时,有人会有细微的皮肤过敏和细微瘙痒疼痛的情况,建议在运用时戴上防护手套,如果出现了这样的情况,需要用酒精擦洗,然后用清水冲洗干净。

  • 明月曾照江东寒剧情(明月曾照江东寒剧情介绍)

    明月曾照江东寒剧情剧情简介:美少女战清泓是武林副盟主战破敌之女,从小被父亲禁止涉及江湖事。十年一期的武林大会即将来临,战清泓瞒着家人偷跑下山,立志夺取武林盟主之位。战清泓与温宥也开始互生情愫,奈何最终被世俗礼法所阻碍。与此同时,江湖上风起云涌,战清泓发现自己自幼背诵的家训竟是人人趋之若鹜的第一神功《鹤羽剑法》。