邱士楷,空穴来风,牛肉面的做法-泥洼地,心中的平坦道路,需要我们走过你洼地

admin 3周前 ( 05-26 17:22 ) 0条评论
摘要: 2018年7月1日OAuth2是一种身份验证协议,用于使用其他服务提供商来对应用程序中的用户进行身份验证和授权。本文将介绍如何构建Go应用程序来实现OAuth2协议。...

2018 年 7 月 1 日

OAuth2 是一种身份验证协议,用于运用其他服务供给商来对运用程序中的用户进行身份验证和授权。

本文将介绍怎么构建 Go 运用程序 来完结 OAuth2 协议。

代码原处:https://github.com/sohamkamani/go-oauth-example

OAuth2 流程

在咱们开端完结之前,让咱们扼要介绍一下 OAuth 协议。假如您从前见过相似这样的对话框,那么您可能对 OAuth 的意义有所了解:

在上图中,能够看到正在测验运用 Github 登录 Gitlab 并进行身份验证。

在任何 OAuth 流程中都有三个参与者:

  1. 客户端 - 登录的人员或用户
  2. 运用者 - 客户端想要登录的运用程序(在上图中是 GitLab)
  3. 服务供给者 - 用户经过其进行身份验证的外部运用程序。(上图中为 GitHub)

在这篇文章中,咱们将运用 Githubs OAuth2 API 进行身份验证,并运用 Web 界面构建一个在本地端口 8080 上运转的 Go 示例运用程序。所以在咱们的比如中,客户端是 Web 界面,顾客是运转的运用程序 loc邱士楷,空穴来风,牛肉面的做法-泥凹地,心中的平整路途,需求咱们走过你凹地alhost:8080,服务供给者则是 Github。让咱们来看看这全部是怎么作业的:

咱们能够在运用程序中完结流程的每个部分。

登陆页面

让咱们创立运用程序的榜首部分,即登录页面。这将是一个简略的 HTML 页面,其间包括用户应单击以运用 Github 进行身份验证的链接。以下内容将构成文件 public/index.html:





Login with GitHub



以上链接有三个要害部分:

  1. https//github.com/login/oauth/authorize 是 Github 的 OAuth 流程的 OAuth 网关。一切 OAuth 供给商都有一个网关 URL,您有必要将该网址发送给用户才干持续。
  2. client_id=myclientid123 - 这指定了运用程序的客户端 ID。此 ID 将奉告 Githu邱士楷,空穴来风,牛肉面的做法-泥凹地,心中的平整路途,需求咱们走过你凹地b 有关测验运用其 OAuth 服务的顾客的身份。OAuth 服务供给商具有门户网站,您能够在其间注册您的顾客。在注册时,您将收到一个客户端 ID(咱们在此处运用 myclientid123)和客户端暗码(稍后咱们将运用)。关于 Github,能够在 https://github.com/settings/applications/new 上进行新顾客运用的注册。
  3. redirect_uri=http://localhost:8080/oauth/redirect - 一旦用户经过服务供给商进行身份验证,指定要获取恳求令牌重定向的 URL。一般,您还有必要在注册门户上邱士楷,空穴来风,牛肉面的做法-泥凹地,心中的平整路途,需求咱们走过你凹地设置此值,以避免任何人设置歹意回调 URL。

接下来,咱们需求以服务的办法供给上面制造的文件 index.html。以下代码将构成一个新文件 main.go:

func main() {

fs := http.FileServer(http.Dir("public"))

http.Handle("/", fs)

http.ListenAndServe(":8080", nil)

}

在当时状态下,您能够发动优茶美服务器(经过履行 go run main.go)并拜访 http:// lo猫娘向前冲calhost:8080,您将看到我藤野凉子们刚刚创立的登录页面。单击“运用 GitHub 登录”链接后,您将被重定向到了解的 OAuth 页面以向 Github 注册。可是,一旦您进行身份验证,您将被重定向到 http张境原坐月子://localhost:8080/oauth/redirect,此刻,它不会履行任何操作,并将导致服务器上的 404 页面。

重定向路由

一旦用户运用 Github 进行身份验证,他们就会被重定向到之前指定的重定向 URL。服务供给商还会增加一个恳求令牌到 URL。在当时比如中,Github 增加了为 code 参数,所以重定向 URL 实践上是这样的 http://localhost:8080/oauth/redirect?code=mycode123,在这儿 mycode123 为恳求令牌的值。咱们需求这个恳求令高压电缆分支箱牌,以及咱们的客户机密钥来获取拜访令牌 (access token),这是实践用于获取用户信息的令牌。咱们经过对 https://github.com/login/oauth/access_token 进行 POST 恳求调用来获取此拜访令牌。

有关 Github 供给给重定向 URL 的信息的完好文档,以及咱们供给的 POST /login/oauth/access_token HTTP 调用所需的信息,能够在此处 找到。

将下面的内容增加到 main.go 文件中,以处理 /oauth/redirect 路由:

const clientID = ""
const clientSecret = ""
func main() {
fs := http.FileServer(http.Dir("public"))
http.Handle("/", fs)
// We will be using `httpClient` to make external HTTP requests later in our code
httpClient := http.Client{}
// Create a new redirect route route
http.HandleFunc("/oauth/redirect", func(w http.ResponseWriter, r *http.Request) {
// First, we need to get the value of the `code` query param
err := r.ParseForm()
if err != nil {
fmt.Fprintf(os.Stdout, "could not parse query: %v", err)
w.WriteHe西游狂想记ader(http.St邱士楷,空穴来风,牛肉面的做法-泥凹地,心中的平整路途,需求咱们走过你凹地atusBadRequest)
}
code := r.yox液力偶合器FormValue("code")
// Next, lets for the HTTP request to call the GitHub OAuth enpoint
// to get our access token
reqURL := fmt.Sprintf("https://github.com/login/oauth/access_token?client_id=%s&client_secret=%s&code=%s", clientID, clientSecret, code)
req, err := http.NewRequest(http.MethodPost, reqURL, nil)
if err != nil {
fmt.Fprintf(os.Stdout, "could not create HTTP r邱士楷,空穴来风,牛肉面的做法-泥凹地,心中的平整路途,需求咱们走过你凹地eq胡歆儿uest: %v", err)
w.WriteHeader(http.StatusBadRequest)
}
// We set this header since we want the response
// as JSON
req.Header.Set("accept", "application/json")
// Send out the HTTP request
res, err := httpClient.Do(req)
if err != nil {
fmt.Fprintf(os.Stdout, "could not send HTTP request: %v", err)
w.WriteHeader(http.StatusInternalServerError)
}
defer res.Body.Close()
// Parse the request body into the `OAuthAccessResponse` struct
var t OAuthAccessResponse
if err := JSON.NewDecoder(res.Body).Decode(合肥丝足会所&t); err != nil {
fmt.Fprintf(os.Stdout, "could not parse JSON response: %v", err)
w.WriteHeader(http.StatusBa如懿传荣佩dRequest)
}
// Finally, send a response to redirect the user to the "welcome" page
// with the access token
w.Header().Set("Location",gayesx "/welcome.html?access_token="+t.AccessToken)
w.WriteHeader(http.StatusFound)
})
http.ListenAndServe(":8080", nil)
}
type OAuthAccessResponse struct {
AccessTok豆豆网走运28en string `json:"access_token"`
}

现在,重定向 URL(假如可用)将将用户重定向到欢迎页面并获取拜访令牌 (access token)。

欢迎页面

欢迎页面是咱们在用户登录后向用户显现的页面。现在咱们具有用户拜访令牌,咱们能够代表他们取得授权的 Github 用户的帐户信息。

有关一切可用 API 的列表,您能够检查Github API 文档

咱们将运用 /user API 获取有puremature关用户的基本信息,并在欢迎页面上与他们打个招邱士楷,空穴来风,牛肉面的做法-泥凹地,心中的平整路途,需求咱们走过你凹地呼。创立一个新文件 public/we只需你姜宁lcome.html:







Hello





经过增加欢迎页面,咱们的 OAuth 流程现已完结!应邱士楷,空穴来风,牛肉面的做法-泥凹地,心中的平整路途,需求咱们走过你凹地用程序发动后,能够转到 http://localhost:8080/,运用 Github 进行授权,最终在欢迎页面上显现问候语。我在 GitHub 配置文件中的姓名是“ Soham Kamani ”,因而登录后 "Welcome, Soham Kamani" 将显现 weclome 纳米神兵动画片全集页面。

该源代码,以及怎么运转的阐明,能够在这儿 找到

让运用更安全

尽管这篇文章展现天鹅公主的隐秘城堡了 OAuth2 的基础常识,但还有许多其他办法能够使您的运用愈加安全,这儿没有触及:

  1. 在此示例中,咱们将拜访令牌 (access token) 传递给客户端,以便它能够作为授权用户宣布恳求。为了使您的运用更安全,拜访令牌不该直接传递给用户。而是创立一个会话令牌,作为 cookie 发送给用户。

该运用程序在服务端将保护会话令牌及拜访令牌的映射。用户不会向 GitHub 宣布恳求,而是向服务器宣布恳求(运用会话令牌),然后运用供给的会话令牌查找拜访令牌并使用拜访令牌在服务器端向 GitHub 宣布恳求。我在这儿 写了更多关于会话和 cookie 的文章。

  1. 在将用户发送到授权 URL 时,能够在 URL 带着一个自定义的查询参数 state。这个参数值应该是运用程序供给的随机不行猜想的字符串。当 GitHub 调用重定向 url 时,它会将此 state 变量附加到恳求参数。新网址现在看起来像: https://github.com/login/oauth/authorize?client_id=myclientid123&redirect_uri=http://localhost:8080/oauth/redirect&state=somerandomstring

运用程序现在能够将此值与其开始生成的值进行比较。假如它们不相同,则意味着恳求来自某个第三方,而且应该被回绝。有关此类型的安全问题的更多信息,您能够阅览我的其他帖子


via: https://www.sohamkamani.com/blog/golang/2018-06-24-oauth-with-golang/

作者:Soham Kamani 译者:lovechuck 校正:polaris1119

本文由 GCTT 原创编译,Go言语中文网 荣誉推出

  • 本文由 GCTT 原创翻译,Go言语中文网 首发。也想参加译者队伍,为开源做一些自己的奉献么?欢迎参加 GCTT!
  • 翻译作业雷炳侠和译文宣布仅用于学习和沟通意图,翻译作业遵循 CC-BY-NC-SA 协议规则,假如咱们的作业有侵犯到您的权益,请及时联络咱们。
  • 欢迎遵循 CC-BY-NC-SA 协议规则 转载,敬请在正文中标示并保存原文/译文链接和作者/译者等信息。
  • 文章仅代表作者的常识和观念,如有不同观念,请楼下排队吐槽

入群沟通(该群和以上内容无关):Go中文网

QQ沟通群:731990104

加微信入微信群:274768166 补白:头条

参加微信大众号:Go言语中文网

文章版权及转载声明:

作者:admin本文地址:http://www.gozeniwa.com/articles/1349.html发布于 3周前 ( 05-26 17:22 )
文章转载或复制请以超链接形式并注明出处泥洼地,心中的平坦道路,需要我们走过你洼地