如何在 Golang 應(yīng)用中使用 OAuth 實(shí)現(xiàn)單點(diǎn)登錄
介紹
你們肯定都遇到過(guò)登錄頁(yè)面,網(wǎng)站或應(yīng)用程序?yàn)槟峁┝耸褂?Google 或 Facebook 登錄的選項(xiàng)。這不會(huì)減少您在相應(yīng)網(wǎng)站上注冊(cè)帳戶的工作量嗎?幾乎所有的網(wǎng)站在訪問(wèn)信息或訪問(wèn)其他網(wǎng)頁(yè)之前都有一個(gè)強(qiáng)制性的登錄標(biāo)準(zhǔn)。想象一下在這些網(wǎng)站上注冊(cè)并記住他們的憑據(jù)的場(chǎng)景。因此,社交登錄可以節(jié)省您的時(shí)間和精力,簡(jiǎn)化您瀏覽各種網(wǎng)站的過(guò)程。
現(xiàn)在,問(wèn)題是您知道在您的 golang 應(yīng)用程序中使用 OAuth 實(shí)現(xiàn)單點(diǎn)登錄 (SSO) 嗎?如果沒(méi)有,那么不用擔(dān)心,這里有教程:如何在 golang 應(yīng)用程序中使用 OAuth 實(shí)現(xiàn) SSO;如果是,那么讓我知道任何其他更好的方法(建設(shè)性的反饋總是有幫助的)。我們將看到一些關(guān)于我們主題的理論部分,然后開始編碼部分。
我們還有一個(gè)關(guān)于同一主題的視頻教程。整個(gè)教程包含在視頻形式中,并附在下面的部分中。
什么是單點(diǎn)登錄 (SSO)?
一次性登錄。
單點(diǎn)登錄 (SSO) 為用戶提供了使用單個(gè)用戶 ID 和密碼登錄相關(guān)但獨(dú)立平臺(tái)的機(jī)會(huì)。通俗地說(shuō),您可以登錄您的 Google 帳戶并使用同一帳戶登錄或注冊(cè)各種其他軟件應(yīng)用程序。
視頻教程:在 Golang 應(yīng)用程序中使用 OAuth 實(shí)現(xiàn)單點(diǎn)登錄
如果您是從視頻教程中掌握更多知識(shí)的人,那么這里是我們開發(fā)人員提供的關(guān)于在 Golang 應(yīng)用程序中使用 OAuth實(shí)施 SSO 的綜合視頻教程。
該視頻將向您展示所有內(nèi)容,并提供一些您需要了解的有用見解。它將涵蓋將應(yīng)用程序注冊(cè)到 Google 控制臺(tái)、后端和前端編碼部分。
想要從頭開始開發(fā)可擴(kuò)展且安全的 Golang 項(xiàng)目?
我們從不妥協(xié)項(xiàng)目質(zhì)量,這就是我們的客戶喜歡我們的原因!利用我們的Golang 開發(fā)服務(wù)的優(yōu)勢(shì)。
將應(yīng)用程序注冊(cè)到 Google 控制臺(tái)儀表板
第一步是將我們的 golang 應(yīng)用程序注冊(cè)到 Google 控制臺(tái)儀表板。為此,在API 和服務(wù)部分下選擇憑據(jù)。如果你愿意,你可以選擇現(xiàn)有的項(xiàng)目,在這里我們將創(chuàng)建一個(gè)新項(xiàng)目,如下圖所示。
按照要求填寫詳細(xì)信息。這里我的項(xiàng)目名稱是Testing-SSO-Golang
創(chuàng)建項(xiàng)目完成后,請(qǐng)確保您已選擇項(xiàng)目,此處為Testing-SSO-Golang。
配置 OAuth 同意屏幕
現(xiàn)在,是時(shí)候配置 OAuth 同意屏幕了。為此,我們需要添加應(yīng)用程序信息,
OAuth 同意屏幕
范圍
測(cè)試用戶
這是所有三個(gè)步驟的摘要。
創(chuàng)建憑據(jù)
現(xiàn)在,轉(zhuǎn)向創(chuàng)建憑據(jù)。
創(chuàng)建 OAuth 客戶端 ID
創(chuàng)建 OAuth 客戶端后下載 JSON 文件。
所以,這是關(guān)于如何注冊(cè)你的 golang 應(yīng)用程序和創(chuàng)建一個(gè) OAuth 客戶端。現(xiàn)在,是時(shí)候編寫一些代碼了。
后端初始設(shè)置
運(yùn)行以下命令創(chuàng)建啟動(dòng) go.mod 文件。
去修改初始化 golang-sso
這將是我們的項(xiàng)目結(jié)構(gòu)-
創(chuàng)建 main.go 并使用下面提到的代碼。
// 主程序
包主
進(jìn)口 (
“golang-sso/控制器”
“網(wǎng)絡(luò)/http”)
功能主要(){
fs := http.FileServer(http.Dir("public"))
http.Handle("/",fs)
http.HandleFunc("/signin",controllers.Signin)
http.HandleFunc("/callback",controllers.Callback)
http.ListenAndServe(":3000",nil)}
解釋
這行代碼中的/signin路由http.HandleFunc(“/signin”,controllers.Signin)用于處理 URL 生成,稍后在登錄后重定向到該 URL。
這行代碼中的/callback路由http.HandleFunc(“/callback”,controllers.Callback)用于從 Google 控制臺(tái)獲取當(dāng)前用戶的代碼和狀態(tài)。
控制器包
現(xiàn)在,在文件夾控制器中創(chuàng)建兩個(gè)文件:signin.go和callback.go 。
// 登錄.go
包控制器
進(jìn)口 (
“調(diào)頻”
“日志”
“網(wǎng)絡(luò)/http”
“操作系統(tǒng)”
“github.com/joho/godotenv”
“golang.org/x/oauth2”
“golang.org/x/oauth2/google”)var ssogolang *oauth2.Configvar RandomString = "隨機(jī)字符串"功能初始化(){
錯(cuò)誤 := godotenv.Load("./.env")
如果錯(cuò)誤!=無(wú){
log.Fatal("加載 .env 文件時(shí)出錯(cuò)")
}
ssogolang = &oauth2.Config{
RedirectURL:os.Getenv("REDIRECT_URL"),
ClientID:os.Getenv("CLIENT_ID"),
ClientSecret:os.Getenv("CLIENT_SECRET"),
范圍:[]string{"https://www.googleapis.com/auth/userinfo.email"},
端點(diǎn):google.Endpoint,
}}
func Signin(w http.ResponseWriter, r *http.Request){
url :=ssogolang.AuthCodeURL(RandomString)
fmt.Println(網(wǎng)址)
http.Redirect(w,r,url,http.StatusTemporaryRedirect)}
這將是我們生成的 URL
解釋
ssogolang = &oauth2.Config{…}是使用我們從那里獲得的憑據(jù)通過(guò)我們的控制臺(tái)應(yīng)用程序配置我們的后端代碼。
此外,我們將進(jìn)入配置中所需的范圍。在這里,我們需要用戶的電子郵件 ID,所以我們使用了
[]字符串{“https://www.googleapis.com/auth/userinfo.email”}。
生成隨機(jī)字符串以從用戶狀態(tài)唯一標(biāo)識(shí)用戶,然后將其傳遞給 OAuth 包中的 AuthcodeUrl 函數(shù),該函數(shù)生成具有所需配置的 URL
// 回調(diào).go
包控制器
進(jìn)口 (
“語(yǔ)境”
“錯(cuò)誤”
“調(diào)頻”
“io/ioutil”
“日志”
“網(wǎng)絡(luò)/http”)
func Callback(w http.ResponseWriter, r *http.Request){
狀態(tài) :=r.FormValue("狀態(tài)")
代碼:= r.FormValue(“代碼”)
數(shù)據(jù),錯(cuò)誤:=getUserData(狀態(tài),代碼)
如果錯(cuò)誤!=無(wú){
log.Fatal("獲取用戶數(shù)據(jù)錯(cuò)誤")
}
fmt.Fprintf(w,"數(shù)據(jù): %s",數(shù)據(jù))}func getUserData(state,code string)([]byte,error){
如果狀態(tài) != RandomString{
return nil,errors.New("無(wú)效的用戶狀態(tài)")
}
token,err:=ssogolang.Exchange(context.Background(),代碼)
如果錯(cuò)誤!=無(wú){
返回零,錯(cuò)誤
}
響應(yīng),錯(cuò)誤:=http.Get("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + token.AccessToken)
如果錯(cuò)誤!=無(wú){
返回零,錯(cuò)誤
}
延遲響應(yīng).Body.Close()
數(shù)據(jù),錯(cuò)誤:= ioutil.ReadAll(響應(yīng).Body)
如果錯(cuò)誤!=無(wú){
返回零,錯(cuò)誤
}
返回?cái)?shù)據(jù),無(wú)}
解釋
state :=r.FormValue(“狀態(tài)”) ,code := r.FormValue(“代碼”)這行代碼將從 Google 控制臺(tái)獲取用戶狀態(tài)和代碼。
此外,檢查用戶狀態(tài)以在以下幫助下唯一標(biāo)識(shí)用戶如果狀態(tài)!= RandomString
使用 Exchange(…) 函數(shù)交換令牌代碼,這是使用 OAuth 庫(kù)的 OAuth 流程的一部分。
現(xiàn)在使用我們使用這行代碼獲得的令牌從 Google API 獲取用戶數(shù)據(jù)響應(yīng),錯(cuò)誤:=http.Get(“https://www.googleapis.com/oauth2/v2/userinfo?access_token=” + token.AccessToken)
前端設(shè)置
到目前為止,我們已經(jīng)介紹了在我們的 golang 應(yīng)用程序中使用 OAuth 實(shí)現(xiàn) SSO 的后端部分?,F(xiàn)在,是時(shí)候編寫一些前端代碼了。
打開 index.html 并為用戶界面使用以下代碼。您當(dāng)然可以根據(jù)自己的意愿更改 UI。
// 索引.html
<分區(qū)>
<form action="/action_page.php">
<div 類="行">
<h2 style="text-align:center">
使用社交媒體或手動(dòng)登錄
</h2>
<div 類="vl">
<span class="vl-innertext">或</span>
</div>
<div 類="col">
<a href="#" class="fb btn">
<i class="fa fa-facebook fa-fw"></i> 使用 Facebook 登錄
</a>
<a href="#" class="推特 btn">
<i class="fa fa-twitter fa-fw"></i> 使用 Twitter 登錄
</a>
<a href="/signin" class="google btn">
<i class="fa fa-google fa-fw"></i> 使用 Google+ 登錄
</a>
</div>
<div 類="col">
<div class="hide-md-lg">
<p>或手動(dòng)登錄:</p>
</div>
<輸入類型=“文本”
名稱=“用戶名”
占位符=“用戶名”
必需的
>
<輸入類型=“密碼”
名稱=“密碼”
占位符=“密碼”
必需的
>
<input type="提交" value="登錄">
</div>
</div>
</表格>
<div class="底部容器">
<div 類="行">
<div 類="col">
<a href="#" style="color:white" class="btn">注冊(cè)</a>
</div>
<div 類="col">
<a href="#" style="color:white" class="btn">忘記密碼?</a>
</div>
</div>
</div></div>
單擊按鈕時(shí)會(huì)將您重定向到登錄路徑。
Github 倉(cāng)庫(kù)
如果您想克隆項(xiàng)目并嘗試使用代碼,那么這里是源代碼:sso-using-oauth-demo
結(jié)論
因此,這是關(guān)于如何在 Golang 應(yīng)用程序中使用 OAuth 實(shí)現(xiàn) SSO。我希望本分步指南的目的已達(dá)到預(yù)期。如需更多帶有 github 源代碼的此類 Golang 教程,請(qǐng)隨時(shí)訪問(wèn)Golang 教程頁(yè)面。
Bacancy 擁有具備基礎(chǔ)知識(shí)和高級(jí)知識(shí)的熟練開發(fā)人員。您是否正在為您的 golang 項(xiàng)目尋找?guī)椭咳绻?,那么?qǐng)毫不猶豫地聯(lián)系我們的Golang 開發(fā)人員