当前位置: 首页 > wzjs >正文

山西建设执业注册管理中心网站今天重大新闻国内最新消息

山西建设执业注册管理中心网站,今天重大新闻国内最新消息,郑州做输卵管哪家医药网站I,郑州网站制作设计如何进行 Github 第三方登录详细讲解 (Java 版本) 文章目录 如何进行 Github 第三方登录详细讲解 (Java 版本)创建一个 Github 应用定义一个跳转按钮,进行 Github 的授权通过授权拿到一个随机的 code通过 code 进行后端…

如何进行 Github 第三方登录详细讲解 (Java 版本)

文章目录

  • 如何进行 Github 第三方登录详细讲解 (Java 版本)
    • 创建一个 Github 应用
    • 定义一个跳转按钮,进行 Github 的授权
    • 通过授权拿到一个随机的 code
    • 通过 code 进行后端回调处理,拿到access_token
    • 拿到授权信息以后可以进行获取用户的信息
    • 拿到的用户信息与数据库进行比对进行登录验证(思路)

创建一个 Github 应用

  1. 点击 Github 的头像

  2. 然后点击设置在这里插入图片描述

  3. 进入设置后,往下滑,点击开发者设置在这里插入图片描述

  4. 然后点击 Oauth apps在这里插入图片描述

  5. 随后创建一个新的OAuth App 在这里插入图片描述

  6. 可以看到的是期中有几个必填选项,下面我们来一一说明在这里插入图片描述

    1. Application name 这个可以随意填写,就是你的一个应用名字而已
    2. Homepage URL 填写你自己的前端页面的首页就好了
    3. Application description 这个就是一个描述,随意填写就好了
    4. Authorization callback URL 这个就是授权了以后进行身份判断的回调地址,用于自己对第三方信息进行获取,处理,鉴权。比较重要
    5. 下面是一个填写示例:在这里插入图片描述
  7. 全部填写好后我们成功创建了一个 Github 授权应用。

  8. 这里需要我们进行几个关键信息的记录,一个是 client_id 这个不会变,一个是 client_secret (注意,这个只能查看一次请妥善保管),这些信息我们后面需要用。

定义一个跳转按钮,进行 Github 的授权

首先在前端页面中定义一个跳转到 Github 授权页面的链接,示例如下:

<a href="https://github.com/login/oauth/authorize?scope=user:email&client_id=请填写自己的client_id">Github登录</a>

这里可以自己随意快速的开一个前端应用,然后加一个链接标签,把 href 属性的值如上就可以了,只需要注意的是其中的 client_id 需要换成自己的就行,创建好以后,前后端分离的那么前端几乎就没有事情需要做了。这里主要是前后端分离版本。

在这里插入图片描述

通过授权拿到一个随机的 code

点击上面的 Github 登录以后会出现一个这样的页面

在这里插入图片描述

点击绿色的按钮就会进行用户的授权,点击后就会重定向到我们上面那个写的回调地址。
在这里插入图片描述

在这里插入图片描述

通过在创建的应用的时候写的回调 URL 进行后端的处理,用户在点击授权以后,页面会重定向进行一个 Get 请求,后端去接收这个请求,并且进行处理就可以了,重定向的时候,会传递一个参数 code ,这个 code 可以用于获取 access_token , 获取到 token 以后用于获取 用户的信息。

接口示例:

public class ThirdLoginController {@GetMapping("/callback")public void getCode(String code){System.out.println(code);

debug 拿值示例
在这里插入图片描述

这一部分只是为了我能够拿到 code 的值,我们一步一步来,看下面 👇

通过 code 进行后端回调处理,拿到access_token

这里我是通过阅读官方文档进行一点一点测试的,官方的文档的语言并不是 Java 这里给出官方文档和我的写法

我的写法(这里发起 Http 请求使用的是 Hutool 工具包)

Map<String, Object > paramMap = new HashMap<>();
paramMap.put("client_id","填写自己的client_id");
paramMap.put("client_secret","填写自己的secret");
paramMap.put("code",code);
paramMap.put("accept","json");
String result = HttpUtil.post("https://github.com/login/oauth/access_token",paramMap);

拿到的结果(类似👇):

access_token=gho_lK2Eop11rUH9U7aDTcxUrdORdTPAIS2vVDbh&scope=user%3Aemail&token_type=bearer

官方参考

get '/callback' do# get temporary GitHub code...session_code = request.env['rack.request.query_hash']['code']# ... and POST it back to GitHubresult = RestClient.post('https://github.com/login/oauth/access_token',{:client_id => CLIENT_ID,:client_secret => CLIENT_SECRET,:code => session_code},:accept => :json)# extract the token and granted scopesaccess_token = JSON.parse(result)['access_token']
end

拿到授权信息以后可以进行获取用户的信息

拿到 token 信息以后,我们要对信息进行处理,从中提取出 access_token 的值,然后就是发起请求获取用户信息了,这里获取用户信息,也是参考官方文档的,后面一直授权不能通过,通过问 AI 解决了问题。

我的示例代码:

// 处理拿到的信息
String token = result.split("&")[0].split("=")[1];// 获取用户信息,发起get 请求,拿到用户信息String finalResult = HttpRequest.get("https://api.github.com/user").header("Authorization","token "+token).header("X-GitHub-Api-Version", "2022-11-28").execute().body();

代码中我出问题的地方在 header 的设置,也就是不知道我获取的 token 怎么传给 github 官方,好像参考的里面说的也不是很明白,后面看了,github 官方关于 授权的文档是要加上两个请求头才能够正常进行请求Authorization(这里需要注意的是,token 值得书写,必须是 token后面空格,写access_token的值) X-GitHub-Api-Version 这个的话就是只需要带上 API 版本的值就好了。

信息结果示例:

{"login": "xwhking","id": 97931879,"node_id": "U_kgDOBdZSZw","avatar_url": "https://avatars.githubusercontent.com/u/97931879?v=4","gravatar_id": "","url": "https://api.github.com/users/xwhking","html_url": "https://github.com/xwhking","followers_url": "https://api.github.com/users/xwhking/followers","following_url": "https://api.github.com/users/xwhking/following{/other_user}","gists_url": "https://api.github.com/users/xwhking/gists{/gist_id}","starred_url": "https://api.github.com/users/xwhking/starred{/owner}{/repo}","subscriptions_url": "https://api.github.com/users/xwhking/subscriptions","organizations_url": "https://api.github.com/users/xwhking/orgs","repos_url": "https://api.github.com/users/xwhking/repos","events_url": "https://api.github.com/users/xwhking/events{/privacy}","received_events_url": "https://api.github.com/users/xwhking/received_events","type": "User","site_admin": false,"name": "xwhking","company": null,"blog": "","location": null,"email": null,"hireable": null,"bio": null,"twitter_username": null,"public_repos": 8,"public_gists": 0,"followers": 1,"following": 2,"created_at": "2022-01-18T04:06:06Z","updated_at": "2024-02-20T02:27:32Z"
}

从中我们可以获取一些最为直观的信息,比如 name(github用户名),avatar_url (头像地址),html_url(用户的 github 主页)等。

还可以以同样的方式获取用户的邮箱,只是请求的url 变化一下而且,就是请求 url 变成 https://api.github.com/user/emails

请求邮箱结果如下:

[{"email": "2837468248@qq.com","primary": true,"verified": true,"visibility": "private"},{"email": "97931879+xwhking@users.noreply.github.com","primary": false,"verified": true,"visibility": null}
]

从中可以获取邮箱信息,通过判断 primary 字段判断是否为私有邮箱。

参考官方文档:

# fetch user information
auth_result = JSON.parse(RestClient.get('https://api.github.com/user',{:params => {:access_token => access_token}}))# if the user authorized it, fetch private emails
if has_user_email_scopeauth_result['private_emails'] =JSON.parse(RestClient.get('https://api.github.com/user/emails',{:params => {:access_token => access_token}}))
enderb :basic, :locals => auth_result

整体的一个后端代码示例:

@RestController
@RequestMapping("/third_login")
public class ThirdLoginController {@GetMapping("/callback")public void getCode(String code){System.out.println(code);Map<String, Object > paramMap = new HashMap<>();paramMap.put("client_id","XXX");paramMap.put("client_secret","XXX");paramMap.put("code",code);paramMap.put("accept","json");String result = HttpUtil.post("https://github.com/login/oauth/access_token",paramMap);String token = result.split("&")[0].split("=")[1];// 获取用户信息String finalResult = HttpRequest.get("https://api.github.com/user").header("Authorization","token "+token).header("X-GitHub-Api-Version", "2022-11-28").execute().body();System.out.println(finalResult);}
}

拿到的用户信息与数据库进行比对进行登录验证(思路)

我们都拿到 Github 上用户的信息了,那么只需要把拿到的信息放入我们自己的数据库,那么是不是就可以让用户进行登录了呀!

比如我们可以记录用户的,id,用户名,邮箱,如果用户是第一次登录,就新创建一条记录,如果不是就进行数据库数据的比对进行登录,如果有错误,不让登录就好。没有错误就把页面重定向到对应的前端页面,并且把用户信息返回给前端。这样应该就算是第三方登录了吧!

大家好,我是xwhking,一名技术爱好者,目前正在全力学习 Java,前端也会一点,如果你有任何疑问请你评论,或者可以加我QQ(或者QQ邮箱,我看见就一定会回复的)(2837468248)说明来意!希望能够与你共同进步

http://www.dtcms.com/wzjs/321013.html

相关文章:

  • 电子商务网站建设成都百度关键词代做排名
  • 龙华区住房和建设局官方网站淘宝指数官网入口
  • 北京建网站费用网页生成
  • 网站前端浏览器兼容如何做搜索引擎网址
  • 网站动画效果用什么程序做的云浮新增确诊病例30例
  • 网站在阿里云备案流程建个网站需要多少钱?
  • 抖音做我女朋友的网站南通关键词优化平台
  • 河池个人网站开发公司郑州seo代理外包
  • 经营性网站备案信息申请长春百度推广电话
  • 怀宁县建设局网站厦门seo排名优化方式
  • 漯河网页制作安徽seo推广公司
  • ae模板免费网站宁波网站seo诊断工具
  • 2014网站设计风格加速游戏流畅的软件
  • 浦项建设中国有限公司网站班级优化大师免费下载电脑版
  • 做100个网站保定seo推广
  • 郑大动态网站建设简答题百度seo网站
  • 新疆建设兵团发改委网站b站视频推广网站400
  • 郑州房地产网站哪有恶意点击软件买的
  • 百度竞价推广托管seo整站优化外包
  • 杭州网站建设开发外包公司网站链接提交
  • 烟台高端网站建设公司域名历史查询工具
  • 做网站 前端雅诗兰黛网络营销策划书
  • 武汉网站建设排行百度关键词排名爬虫
  • 政府网站建设费用增加百度图片识别搜索引擎
  • wordpress 特殊符号杭州上城区抖音seo有多好
  • wap网站e4a做app广告投放怎么做
  • 网站内容页显示不出来郑州网站技术顾问
  • 网站开发好不好月入百万的游戏代理
  • 上海平台网站开发网站开发流程
  • 学做网站论坛软文写作范文