草庐IT

GitHub OAuth第三方登录

西界__ 2023-03-28 原文

GitHub OAuth 第三方登录示例教程 - 阮一峰的网络日志 (ruanyifeng.com)

概述

前面介绍了OAuth的详细概念知识。很多网站登录时,允许使用第三方网站的身份,这称为"第三方登录"。

image.png

下面就以 GitHub 为例,写一个最简单的应用,演示第三方登录。

第三方登录的原理

所谓第三方登录,实质就是 OAuth 授权。用户想要登录 A 网站,A 网站让用户提供第三方网站的数据,证明自己的身份。获取第三方网站的身份数据,就需要 OAuth 授权。

举例来说,A 网站允许 GitHub 登录,背后就是下面的流程。

  1. A 网站让用户跳转到 GitHub。
  2. GitHub 要求用户登录,然后询问"A 网站要求获得 xx 权限,你是否同意?"
  3. 用户同意,GitHub 就会重定向回 A 网站,同时发回一个授权码。
  4. A 网站使用授权码,向 GitHub 请求令牌。
  5. GitHub 返回令牌.
  6. A 网站使用令牌,向 GitHub 请求用户数据。

应用登记

一个应用要求 OAuth 授权,必须先到对方网站登记,让对方知道是谁在请求。

所以,你要先去 GitHub 登记一下。当然,我已经登记过了,你使用我的登记信息也可以,但为了完整走一遍流程,还是建议大家自己登记。这是免费的。

访问这个网址,填写登记表。也可以查看一下GitHub的文档

image.png
image.png

接着就能看见我们应用

  • Client ID
  • Client secrets

记得保存。

操作流程

GitHub Authorizing OAuth Apps Docs

使用的是OAuth的授权码方式授权。

The web application flow to authorize users for your app is:

  1. Users are redirected to request their GitHub identity
  2. Users are redirected back to your site by GitHub
  3. Your app accesses the API with the user's access token

为您的应用程序授权用户的 Web 应用程序流程是:

  1. 用户被重定向以请求他们的 GitHub 身份
  2. 用户被 GitHub 重定向回您的站点
  3. 您的应用使用用户的访问令牌访问 API

请求用户的 GitHub 身份

GET https://github.com/login/oauth/authorize

当您的 GitHub 应用程序指定一个login参数时,它会提示用户使用他们可以用于登录和授权您的应用程序的特定帐户。

姓名 类型 描述
client_id string 必填注册时从 GitHub 收到的客户端 ID 。
redirect_uri string 您的应用程序中的 URL 将在授权后发送用户。请参阅下面有关重定向 url的详细信息。
login string 建议用于登录和授权应用程序的特定帐户。
scope string 以空格分隔的范围列表。如果未提供,scope则默认为未授权应用程序任何范围的用户的空列表。对于拥有应用程序授权范围的用户,用户将不会看到带有范围列表的 OAuth 授权页面。相反,流程的这一步将自动完成用户为应用程序授权的范围集。例如,如果用户已经执行了两次 Web 流,并且已经授权了一个具有范围的user令牌和另一个具有repo范围的令牌,则不提供 a 的第三个 Web 流scope将接收具有userrepo范围的令牌。
state string 一个不可猜测的随机字符串。它用于防止跨站点请求伪造攻击。
allow_signup string 在 OAuth 流程期间,是否会为未经身份验证的用户提供注册 GitHub 的选项。默认值为true. false在政策禁止注册时使用。
image.png

启动项目,访问localhost:8080/点击超链接之后,就会要登录GitHub账号。

image.png

接着就会对其进行授权。

用户被 GitHub 重定向回你的站点

如果用户接受您的请求,GitHub 将重定向回您的站点,其中包含一个临时code的代码参数以及您在上一步中提供的state参数状态。临时代码将在 10 分钟后过期。如果状态不匹配,则第三方创建了请求,您应该中止该过程。

也就是重回到我们的站点,也就是发送了/localhost:8080/oauth/redirect(自定义),并且携带了code

将此交换code为访问令牌:

POST https://github.com/login/oauth/access_token
姓名 类型 描述
client_id string 必需的。您从 GitHub 收到的 OAuth 应用程序的客户端 ID。
client_secret string 必需的。您从 GitHub 收到的 OAuth 应用程序的客户端密码。
code string 必需的。您收到的作为对步骤 1 的响应的代码。
redirect_uri string 授权后发送用户的应用程序中的 URL。

默认情况下,响应采用以下形式:

access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer

如果您在Accept标头中提供格式,您还可以接收不同格式的响应。例如,Accept: application/jsonAccept: application/xml

Accept: application/json
{
  "access_token":"gho_16C7e42F292c6912E7710c838347Ae178B4a",
  "scope":"repo,gist",
  "token_type":"bearer"
}
Accept: application/xml
<OAuth>
  <token_type>bearer</token_type>
  <scope>repo,gist</scope>
  <access_token>gho_16C7e42F292c6912E7710c838347Ae178B4a</access_token>
</OAuth>
image.png

使用访问令牌访问API

访问令牌允许您代表用户向 API 发出请求。

Authorization: token OAUTH-TOKEN
GET https://api.github.com/user

Authorization: token OAUTH-TOKEN请求头设置参数(token后面有空格)

image.png

代码完成,此时首页点击超链接之后就会得到GitHub的用户信息Json数据。

image.png

显示效果使用了Json浏览器插件。

到此为止大功告成~~

代码地址

https://gitee.com/kylincw/github-oauth-demo

有关GitHub OAuth第三方登录的更多相关文章

  1. ruby - 尝试比较两个文本文件,并根据信息创建第三个 - 2

    我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende

  2. ruby - 使用 Ruby 和 Mechanize 登录网站 - 2

    我需要从站点抓取数据,但它需要我先登录。我一直在使用hpricot成功地抓取其他网站,但我是使用mechanize的新手,我真的对如何使用它感到困惑。我看到这个例子经常被引用:require'rubygems'require'mechanize'a=Mechanize.newa.get('http://rubyforge.org/')do|page|#Clicktheloginlinklogin_page=a.click(page.link_with(:text=>/LogIn/))#Submittheloginformmy_page=login_page.form_with(:act

  3. ruby-on-rails - 使用用户或管理员模型和 Basecamp 样式子域设计登录 - 2

    我为Devise用户和管理员提供了不同的模型。我也在使用Basecamp风格的子域。除了我需要能够以用户或管理员身份进行身份验证的一些Controller和操作外,一切都运行良好。目前我有authenticate_user!在我的application_controller.rb中设置,对于那些只有管理员才能访问的Controller和操作,我使用skip_before_filter跳过它。不幸的是,我不能简单地指定每个Controller的身份验证要求,因为我仍然需要一些Controller和操作才能被用户或管理员访问。我尝试了一些方法都无济于事。看来,如果我移动authentica

  4. ruby - 如何使用 omniauth/oauth 对每秒登录数进行基准测试? ( ruby +rspec) - 2

    我想用一个(自己的)omniauth提供商来衡量每秒可以登录多少次。我需要了解此omniauth/oauth请求的性能如何,以及此身份验证是否具有可扩展性?到目前为止我得到了什么:defperformance_auth(user_count=10)bm=Benchmark.realtimedouser_count.timesdo|n|forkdoclick_on'Logout'omniauth_config_mock(:provider=>"foo",:uid=>n,:email=>"foo#{n}@example.net")visit"/account/auth/foo/"enden

  5. ruby - 如何使用 Ruby 和 eventmachine 登录? - 2

    我正在使用Ruby和Eventmachine库编写一个应用程序。我真的很喜欢非阻塞I/O和事件驱动系统的想法,我遇到的问题是日志记录。我正在使用Ruby的标准记录器库。并不是说日志记录需要永远,但它似乎不应该阻塞,但它确实阻塞了。是否有某个库将Ruby的标准记录器实现扩展为非阻塞的,或者我应该只调用EM::defer进行日志记录调用?有没有办法让eventmachine已经为我做这件事? 最佳答案 我最终将记录器包装在一个启动线程并具有FIFO队列的单例类中。日志记录会将日志信息转储到队列中,线程只是循环,从队列中拉出内容并使用真正

  6. ruby-on-rails - 尝试登录和使用 heroku 时无法识别 ruby​​.exe - 2

    当尝试创建一个heroku应用程序并通过git推送到它时,我收到以下错误:$herokucreate'"C:\ProgramFiles\ruby-1.9.2\bin\ruby.exe"isnotrecognizedasaninternalorexternalcommand,operableprogramorbatchfile.但是,$ruby-vruby1.9.3p125[i386-mingw32]我已经检查了PATH环境,它肯定包含“C:\ProgramFiles(x86)\ruby-1.9.2\bin”。同样有趣的是,当导航到该目录时,它实际上并不包含名为ruby​​.exe的文件

  7. ruby-on-rails - 使用 Ruby on Rails 设计 - 强制用户在首次登录时更改密码 - 2

    我有一个运行Devise的RoR应用程序(Rails4.2、Ruby2.2.0)。我已对其进行设置,以便管理员用户(标识我添加到用户模型的“is_admin”bool值)能够创建新的用户帐户,为他们提供生成的密码和确认电子邮件。这一切都正常工作。我还添加了datetime列pass_changed,当用户更改密码时应该更新它,然后检查created_at以确保自帐户创建以来密码已更改。如果两个日期相同,则用户将被重定向到密码更改表单。我编写了一个程序来检查用户是否更改了密码并将其放在我的application_controller.rb中:defcheck_changed_pass@u

  8. ruby-on-rails - 如何使 ActiveRecord::Schema.define 不登录到标准输出? - 2

    我在文档中看不到这个,但我认为这是一个已解决的问题。我在Rails之外使用ActiveRecord,我的脚本加载了从另一个应用程序转储的schema.rb。我想加载此模式而不将迁移输出转储到标准输出,但替换ActiveRecord::Base.logger不会关闭它。我应该覆盖什么来阻止噪音? 最佳答案 技巧显然在ActiveRecord::Migration中:ActiveRecord::Migration.verbose=false这使得迁移不会将信息输出到$stdout。有一个名为.suppress_messages的便捷包装

  9. Win10 / 11新电脑最简单跳过联网激活和使用本地账户登录方法 - 2

    跳过联网激活:OOBE界面直接按Ctrl+Shift+F3进入审核模式。这样就可以直接进入系统进行一些硬件测试等,而不用联网激活导致新机无法退货。需要注意的是,在审核模式下进行的一些操作都会保留,并不会在退出后自动还原!安装的软件在正常开机进系统后还会看见!如果电脑确实没连互联网又不想强行跳过OOBE(网上很多教程会叫你直接结束OOBE进程,但这是不推荐的,因为一些厂商自带优化程序和系统初始化设置在后面都会应用,对于笔记本跳过的话你会发现驱动和内置应用都没有装上。其实这部分脚本就在系统盘的Recovery隐藏文件夹下),可以参考以下方式:https://www.landiannews.com/

  10. Centos7-yum安装mysql-修改密码-无密码登录-安全配置 - 2

    目录1、yum安装mysql修改密码(1)在mysql里面修改(2)第二种方式,利用mysqladmin修改密码2、没有密码,登录mysql修改密码3、mysql的安全设置1、yum安装mysql在CentOS中默认安装有MariaDB(MySQL的一个分支),安装完成之后可以直接覆盖MariaDB。rpm-qa|grepmariadb查询是否安装了mariadbrpm-e--nodepsmariadb-libs-5.5.60-1.el7_5.x86_64卸载mariadwgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.

随机推荐