如何在 Golang 应用中使用 OAuth 实现单点登录

言鼎科技 2023-06-27 704

介绍

你们肯定都遇到过登录页面,网站或应用程序为您提供了使用 Google 或 Facebook 登录的选项。这不会减少您在相应网站上注册帐户的工作量吗?几乎所有的网站在访问信息或访问其他网页之前都有一个强制性的登录标准。想象一下在这些网站上注册并记住他们的凭据的场景。因此,社交登录可以节省您的时间和精力,简化您浏览各种网站的过程。

现在,问题是您知道在您的 golang 应用程序中使用 OAuth 实现单点登录 (SSO) 吗?如果没有,那么不用担心,这里有教程:如何在 golang 应用程序中使用 OAuth 实现 SSO;如果是,那么让我知道任何其他更好的方法(建设性的反馈总是有帮助的)。我们将看到一些关于我们主题的理论部分,然后开始编码部分。

我们还有一个关于同一主题的视频教程。整个教程包含在视频形式中,并附在下面的部分中。

什么是单点登录 (SSO)?

一次性登录。

单点登录 (SSO) 为用户提供了使用单个用户 ID 和密码登录相关但独立平台的机会。通俗地说,您可以登录您的 Google 帐户并使用同一帐户登录或注册各种其他软件应用程序。

视频教程:在 Golang 应用程序中使用 OAuth 实现单点登录

如果您是从视频教程中掌握更多知识的人,那么这里是我们开发人员提供的关于在 Golang 应用程序中使用 OAuth实施 SSO 的综合视频教程。

该视频将向您展示所有内容,并提供一些您需要了解的有用见解。它将涵盖将应用程序注册到 Google 控制台、后端和前端编码部分。

想要从头开始开发可扩展且安全的 Golang 项目?
我们从不妥协项目质量,这就是我们的客户喜欢我们的原因!利用我们的Golang 开发服务的优势。

将应用程序注册到 Google 控制台仪表板

第一步是将我们的 golang 应用程序注册到 Google 控制台仪表板。为此,在API 和服务部分下选择凭据。如果你愿意,你可以选择现有的项目,在这里我们将创建一个新项目,如下图所示。


按照要求填写详细信息。这里我的项目名称是Testing-SSO-Golang


创建项目完成后,请确保您已选择项目,此处为Testing-SSO-Golang。

现在,是时候配置 OAuth 同意屏幕了。为此,我们需要添加应用程序信息,


范围


测试用户


这是所有三个步骤的摘要。


创建凭据

现在,转向创建凭据。

  • 创建 OAuth 客户端 ID


创建 OAuth 客户端后下载 JSON 文件。


所以,这是关于如何注册你的 golang 应用程序和创建一个 OAuth 客户端。现在,是时候编写一些代码了。

后端初始设置

运行以下命令创建启动 go.mod 文件。


去修改初始化 golang-sso

这将是我们的项目结构-


创建 main.go 并使用下面提到的代码。

// 主程序


包主
进口 (
“golang-sso/控制器”
“网络/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 控制台获取当前用户的代码和状态。

控制器包

现在,在文件夹控制器中创建两个文件:signin.gocallback.go 

// 登录.go


包控制器
进口 (
“调频”
“日志”
“网络/http”
“操作系统”

“github.com/joho/godotenv”
“golang.org/x/oauth2”
“golang.org/x/oauth2/google”)var ssogolang *oauth2.Configvar RandomString = "随机字符串"功能初始化(){
 错误 := godotenv.Load("./.env")
如果错误!=无{
  log.Fatal("加载 .env 文件时出错")
}
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"},
  端点:google.Endpoint,
}}
func Signin(w http.ResponseWriter, r *http.Request){
url :=ssogolang.AuthCodeURL(RandomString)
fmt.Println(网址)
http.Redirect(w,r,url,http.StatusTemporaryRedirect)}

这将是我们生成的 URL


解释

  • ssogolang = &oauth2.Config{…}是使用我们从那里获得的凭据通过我们的控制台应用程序配置我们的后端代码。

  • 此外,我们将进入配置中所需的范围。在这里,我们需要用户的电子邮件 ID,所以我们使用了

  • []字符串{“https://www.googleapis.com/auth/userinfo.email”}。
    生成随机字符串以从用户状态唯一标识用户,然后将其传递给 OAuth 包中的 AuthcodeUrl 函数,该函数生成具有所需配置的 URL

// 回调.go


包控制器
进口 (
“语境”
“错误”
“调频”
“io/ioutil”
“日志”
“网络/http”)
func Callback(w http.ResponseWriter, r *http.Request){
状态 :=r.FormValue("状态")
代码:= r.FormValue(“代码”)
数据,错误:=getUserData(状态,代码)
如果错误!=无{
  log.Fatal("获取用户数据错误")
}
fmt.Fprintf(w,"数据: %s",数据)}func getUserData(state,code string)([]byte,error){
如果状态 != RandomString{
  return nil,errors.New("无效的用户状态")
}
token,err:=ssogolang.Exchange(context.Background(),代码)
如果错误!=无{
  返回零,错误
}
响应,错误:=http.Get("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + token.AccessToken)
如果错误!=无{
  返回零,错误
}
延迟响应.Body.Close()
数据,错误:= ioutil.ReadAll(响应.Body)
如果错误!=无{
  返回零,错误
}
返回数据,无}

解释

  • state :=r.FormValue(“状态”) ,code := r.FormValue(“代码”)这行代码将从 Google 控制台获取用户状态和代码。

  • 此外,检查用户状态以在以下帮助下唯一标识用户如果状态!= RandomString

  • 使用 Exchange(…) 函数交换令牌代码,这是使用 OAuth 库的 OAuth 流程的一部分。

  • 现在使用我们使用这行代码获得的令牌从 Google API 获取用户数据响应,错误:=http.Get(“https://www.googleapis.com/oauth2/v2/userinfo?access_token=” + token.AccessToken)

前端设置

到目前为止,我们已经介绍了在我们的 golang 应用程序中使用 OAuth 实现 SSO 的后端部分。现在,是时候编写一些前端代码了。

打开 index.html 并为用户界面使用以下代码。您当然可以根据自己的意愿更改 UI。

// 索引.html


<分区>
<form action="/action_page.php">
  <div 类="行">
     <h2 style="text-align:center">
        使用社交媒体或手动登录
     </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>或手动登录:</p>
           </div>
   
           <输入类型=“文本”
              名称=“用户名”
              占位符=“用户名”
              必需的
            >
           <输入类型=“密码”
               名称=“密码”
               占位符=“密码”
               必需的
            >
           <input type="提交" value="登录">
       </div>
   </div>
</表格>

<div class="底部容器">
  <div 类="行">
     <div 类="col">
       <a href="#" style="color:white" class="btn">注册</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>

单击按钮时会将您重定向到登录路径。


Github 仓库

如果您想克隆项目并尝试使用代码,那么这里是源代码:sso-using-oauth-demo

结论

因此,这是关于如何在 Golang 应用程序中使用 OAuth 实现 SSO。我希望本分步指南的目的已达到预期。如需更多带有 github 源代码的此类 Golang 教程,请随时访问Golang 教程页面。

Bacancy 拥有具备基础知识和高级知识的熟练开发人员。您是否正在为您的 golang 项目寻找帮助?如果是,那么请毫不犹豫地联系我们的Golang 开发人员

言鼎科技

The End