如何在 Golang 應(yīng)用中使用 OAuth 實(shí)現(xiàn)單點(diǎn)登錄

言鼎科技 2023-06-27 706

介紹

你們肯定都遇到過(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。

現(xiàn)在,是時(shí)候配置 OAuth 同意屏幕了。為此,我們需要添加應(yīng)用程序信息,


范圍


測(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.gocallback.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>


<span style="font-size: 16px; font-family: 宋體, SimSun;">&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; vertical-align: inherit;&quot;&gt;&amp;lt;a href=”/登錄”&amp;gt;&lt;/span&gt;&lt;/span&gt;</span>

單擊按鈕時(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ā)人員

言鼎科技

The End