使用GitHub的OAuth 2.0服务登录第三方网站:图文教程
使用GitHub的OAuth 2.0服务登录第三方网站:图文教程
要使用GitHub的OAuth 2.0服务登录第三方网站,通常需要完成以下三个步骤的配置:
- 在GitHub开发者后台创建一个应用,并配置重定向地址(回调地址),以获取客户端ID(Client ID)和客户端密钥(Client Secret)。
- 根据客户端ID、客户端密钥和回调地址构造登录页面,让用户授权,以获取访问令牌(Token)。
- 使用获取到的访问令牌访问GitHub的开放资源。
在开始之前,我们先来了解一下什么是OAuth 2.0。
什么是OAuth 2.0?
OAuth 2.0是一种开放标准的授权协议,用于授权第三方应用程序访问受保护的资源,而无需用户提供其用户名和密码。它允许用户通过授权代理向第三方应用程序颁发访问令牌(access token),以访问特定的资源。OAuth 2.0的核心概念包括授权服务器(Authorization Server)、资源所有者(Resource Owner)、客户端(Client)、资源服务器(Resource Server)和访问令牌(Access Token)。OAuth 2.0被广泛应用于Web和移动应用程序中,提供了安全的授权机制,同时保护用户的隐私。
OAuth 2.0协议涉及以下角色:
- 资源所有者(Resource Owner):通常是用户,拥有受保护的资源,例如图片、个人资料等。
- 客户端(Client):第三方应用程序,想要访问资源所有者的受保护资源。
- 授权服务器(Authorization Server):负责认证资源所有者并授权客户端访问资源的服务器。
- 资源服务器(Resource Server):存储受保护资源的服务器,提供访问受保护资源的API。
OAuth 2.0协议通过授权流程(Authorization Flow)来实现授权。其中,常见的授权流程包括:
- 授权码授权流程(Authorization Code Grant):客户端重定向用户到授权服务器,用户登录并授权后,授权服务器返回授权码给客户端,客户端使用授权码与客户端凭证交换访问令牌。
- 授权码授权流程,带有PKCE(Authorization Code Grant,With PKCE):与标准授权码模式相同,但客户端需要使用PKCE(Proof Key for Code Exchange)来增强安全性。
- 密码授权流程(Resource Owner Password Credentials Grant):资源所有者直接将用户名和密码提供给客户端,客户端使用这些凭据向授权服务器请求访问令牌。
- 客户端凭证授权流程(Client Credentials Grant):客户端使用自己的凭据直接向授权服务器请求访问令牌,适用于客户端自身需要访问资源的情况。
- 隐式授权流程(Implicit Grant):用于在浏览器中直接从客户端获得访问令牌,通常用于Web前端应用。
GitHub使用的OAuth 2.0授权流程就是“授权码授权流程(Authorization Code Grant)”,下面我们来介绍一下具体实现步骤。
步骤1:创建应用,获取客户端ID和客户端密钥
要获取客户端ID和客户端密钥,首先需要在GitHub创建一个应用。访问以下链接进行创建:
https://github.com/settings/applications/new
在“Homepage URL”中填写你的域名,如果是本地调试,可以填写本地服务地址,例如:
在“Authorization callback URL”中填写你的回调地址,可以是你的域名,也可以是你本地的回调地址,例如:
http://127.0.0.1:8000/callback
相关配置填写之后,点击“Register application”创建即可。
应用创建完毕后,会生成客户端ID和客户端密钥。客户端密钥需要单独生成,点击“Generate a new client secret”生成一个密钥即可。
步骤2:获取访问令牌
获取访问令牌这一步,我们通过HTTP请求来演示。根据GitHub官方文档的描述,在进行OAuth 2.0认证时,授权码的请求地址(Auth URL)是:
https://github.com/login/oauth/authorize
将这个授权码的请求地址填写到HTTP请求中即可,这个地址可以理解为登录授权页面,在首次校验登录状态时会打开这个页面(在客户端是窗口),然后让你填写用户名和密码。
一般在手动构造登录授权页面的时候,这个授权地址的后面还需要携带一些参数,比如像下面这样的:
https://github.com/login/oauth/authorize?
client_id=${clientId}&
redirect_uri=http%3A%2F%2F127.0.0.1%3A8000%2Fcallback&
scope=user:email
注:正常情况下无需进行参数换行,http%3A%2F%2F127.0.0.1%3A8000%2Fcallback是http://127.0.0.1:8000/callback转换成urlencode格式的样子。
根据GitHub官方文档的描述,要申请到访问令牌,需要请求的URL为:
https://github.com/login/oauth/access_token
将上面这个地址填写到HTTP请求中即可。因为在默认情况下,GitHub在返回访问令牌时,它的返回响应采用以下的格式:
access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer
这个格式目前在大多数工具中不能自动解析,所以你需要在请求头中添加Accept: application/json,这样子返回响应就是JSON格式了。
上文的配置项都设置好以后,就可以发起请求来获取访问令牌了。点击后,如果是初次登录,会弹出一个窗口让你授权,填写你的GitHub账户的用户名以及密码即可。
填写完用户名密码后,会让你确认授权,或者进行两步验证,验证过后,点击确认即可。授权完成后,就会自动获取到访问令牌,并显示在页面上,同时,会将GitHub返回的其它信息也一并解析出来。
注意,如果你开了代理,你需要到“设置”里把代理打开,不然有可能会连接失败。遇到其它错误,你可以检查一下是不是某些第三方平台需要的必填参数没有填写,修改错误后,重新发起请求即可。
步骤3:根据Token访问开放资源
有了访问令牌(Token)之后,你就可以拿这个访问令牌调取GitHub的开放资源了,具体有什么样的开放资源,可以在GitHub API中查看。比如下面这个API就获取了用户的信息:
https://api.github.com/user
发送请求时会自动将Token附加到请求头的Authorization中,添加至Bearer后发送出去。如果你要将Token携带在URL上,你也可以在页面的配置项中修改Token的“添加位置”,将其选择为“Query Params”即可。
总结
OAuth 2.0是一种授权框架,允许第三方应用获取访问令牌而无需用户提供用户名密码。GitHub使用的授权流程是“授权码授权流程”,其授权过程可以在HTTP工具中调试配置。
使用GitHub的OAuth 2.0服务登录第三方网站一般需要以下三步操作配置:1. 在GitHub开发者后台创建应用,配置重定向地址以获取客户端ID和密钥。2. 根据ID、密钥和重定向地址构造登录页面,用户授权后获取访问令牌。3. 有了令牌即可访问GitHub的开放资源。
需要注意的是,本文内容基于2024年4月的GitHub API,GitHub的API和相关服务可能会有更新,因此在实际操作时需要检查最新的API文档。