导言
- 关于
OAuth2.0
是什么,可以参考阮一峰老师的文章 — OAuth 2.0 的一个简单解释 - 以下将使用
Go
语言,通过OAuth2.0
,达到第三方登录Github的目的。并在登录成功后,展示用户Github
的信息。 - 最终源码参考: Go语言第三方登录Github
原理
第三方网站登录 Github
的原理如下:
- 用户在第三方网站点击
Github授权登录
后,浏览器跳转到Github
登录页面。 - 用户在
Github
登录成功后,浏览器重定向回第三方网站。此时浏览器会携带一个code
。 - 第三方网站服务器通过
code
向Github
索取token
。 Github
返回token
。- 第三方网站服务器收到
token
后,就可以通过token
获取用户信息了。
不懂也没关系,下面将循序渐进的进行实现。
实战
登记阶段
第三方网站要登录 Github
必须进行登记。访问这个网址,可以进行登记。
上面的 Authorization callback URL
就是 用户在 Github
登录成功后重定向回的 url
。
登记成功后,可以看到以下信息:
Github
会通过识别这些信息,判断第三方网站能否进行合法登录。
在编写代码阶段,我会把这些信息放在一个结构体
Conf
中。结构体代码如下:
type Conf struct { ClientId string // 对应: Client ID ClientSecret string // 对应: Client Secret RedirectUrl string // 对应: Authorization callback URL }```
接下来,我们进行代码编写。
页面展示
前端代码如下:
views/hello.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="https://github.com/login/oauth/authorize?client_id={
{.ClientId}}&redirect_uri={
{.RedirectUrl}}">Github 第三方授权登录</a>
</body>
</html>
上面的 ClientId
和 RedirectUrl
将在后续传入。
后端代码如下:
main.go
package main
type Conf struct {
ClientId string
ClientSecret string
RedirectUrl string
}
var conf = Conf{
ClientId: "7e5fe351bc9b131c6f2a",
ClientSecret: "9fd22c13ae790685c59e3fb4a9b444b75b506a5b",
RedirectUrl: "http://localhost:9090/oauth/redirect",
}
func Hello(w http.ResponseWriter, r *http.Request) {
// 解析指定文件生成模板对象
var temp *template.Template
var err error
if temp, err = template.ParseFiles(