前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【实践】如何用GO实现OAuth2授权功能

【实践】如何用GO实现OAuth2授权功能

作者头像
辉哥
发布2019-05-19 15:01:05
3.8K0
发布2019-05-19 15:01:05
举报
文章被收录于专栏:区块链入门区块链入门

1, 摘要

本文讲解了用GO实现OAuth2授权功能的调试方法,具体代码请参考工程文件,原理请参考另外2篇文章《OAuth 2.0 的四种方式》, 《OAuth2介绍与使用》

2.1 创建文件

在gopkg.in\oauth2.v3\example\server的目录下创建 server2.go文件。

代码语言:javascript
复制
package main

import (
    "log"
    "net/http"

    "gopkg.in/oauth2.v3/errors"
    "gopkg.in/oauth2.v3/manage"
    "gopkg.in/oauth2.v3/models"
    "gopkg.in/oauth2.v3/server"
    "gopkg.in/oauth2.v3/store"
)

func main() {
    manager := manage.NewDefaultManager()
    // token memory store
    manager.MustTokenStorage(store.NewMemoryTokenStore())

    // client memory store
    clientStore := store.NewClientStore()
    clientStore.Set("000000", &models.Client{
        ID:     "000000",
        Secret: "999999",
        Domain: "http://localhost",
    })
    manager.MapClientStorage(clientStore)

    srv := server.NewDefaultServer(manager)
    srv.SetAllowGetAccessRequest(true)
    srv.SetClientInfoHandler(server.ClientFormHandler)

    srv.SetInternalErrorHandler(func(err error) (re *errors.Response) {
        log.Println("Internal Error:", err.Error())
        return
    })

    srv.SetResponseErrorHandler(func(re *errors.Response) {
        log.Println("Response Error:", re.Error.Error())
    })

    http.HandleFunc("/authorize", func(w http.ResponseWriter, r *http.Request) {
        err := srv.HandleAuthorizeRequest(w, r)
        if err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
        }
    })

    http.HandleFunc("/token", func(w http.ResponseWriter, r *http.Request) {
        srv.HandleTokenRequest(w, r)
    })

    log.Fatal(http.ListenAndServe(":9096", nil))
}

2.2 编译和运行

代码语言:javascript
复制
go build server2.go

./server2

2.3在本地浏览器打开

http://localhost:9096/token?grant_type=client_credentials&client_id=000000&client_secret=999999&scope=read

浏览器会返回JSON格式的ACCESS TOKEN授权码。

代码语言:javascript
复制
{
    "access_token": "IPBCRFH4N7CHPKWSXDDAQW",
    "expires_in": 7200,
    "scope": "read",
    "token_type": "Bearer"
}

截图:

3,完整四种授权方式代码

3.1 编译/运行授权服务器

进入GO 目录工程的gopkg.in\oauth2.v3\example\server下,编译运行OAUTH服务。

代码语言:javascript
复制
$ cd example/server
$ go build server.go
$ ./server

运行截图:

3.2 编译/运行客户端服务器

进入GO 目录工程的gopkg.in\oauth2.v3\example\client下,编译运行OAUTH服务。

代码语言:javascript
复制
$ cd example/client
$ go build client.go
$ ./client

运行截图:

3.3 授权码模式授权测试

3.3.1 浏览器打开

http://localhost:9094

代码语言:javascript
复制
{
  "access_token": eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIyMjIyMjIiLCJleHAiOjE1NTgwNzAxNTMsInN1YiI6IjAwMDAwMCJ9.RPDu6BkZ9_ZFUWqbMkNbcwMukt2NXbd9S9GAdhQ0ZVtV7qfeBslvOQLyfHKPVT30dFaUoRZFxuIXTQCotN6Sqw",
  "token_type": "Bearer",
  "refresh_token": "E_DW6S_EURIMCJ1NATXSJA",
  "expiry": "2019-05-17T13:15:53.5879631+08:00""
}

运行截图:

3.3.2 使用access token

在浏览器输入 http://localhost:9094/try

有了ACCESS TOKEN,就可以直接打开客户端主页了,完成登录后的呈现。

代码语言:javascript
复制
{
  "client_id": "222222",
  "expires_in": 7195,
  "user_id": "000000"
}

3.3.3 更新 access token

浏览器输入 http://localhost:9094/refresh

代码语言:javascript
复制
{
  "access_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIyMjIyMjIiLCJleHAiOjE1NTgwNzAzNTMsInN1YiI6IjAwMDAwMCJ9._El-BI4GWjqcpjXXmFr5ClIYrIoWeLWSiaDCECSw-2tHhffvbzdt8p0DzD_LH9V1mDgkrDo894ZLDE3W1uM4vA",
  "token_type": "Bearer",
  "refresh_token": "ABZBEXS4XYOVHYYOLQYSUQ",
  "expiry": "2019-05-17T13:19:13.9847635+08:00"
}

3.4 密码授权模式

浏览器输入 http://localhost:9094/pwd

代码语言:javascript
复制
{
  "access_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIyMjIyMjIiLCJleHAiOjE1NTgwNzA0NTUsInN1YiI6InRlc3QifQ.X0ejwzSjzrWYz2Uoqm0jKkIo9hPcJvdDCW0spFmgCZyRzmgGWmKSjjNdUEfDVg4yM80zN0HJLmJRYhC4nG_mvQ",
  "token_type": "Bearer",
  "refresh_token": "YFKHVYGYVHSQKZ-9DKXVWW",
  "expiry": "2019-05-17T13:20:55.3377359+08:00"
}

截图输出:

3.5 凭证式(Client Credentials)授权模式

浏览器输入 http://localhost:9094/client

代码语言:javascript
复制
{
  "access_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIyMjIyMjIiLCJleHAiOjE1NTgwNzA4ODZ9.F4qFiGc3BDb8dY_kOFzkLHa775bF9EliI6a47DFNQnQ4rn_qE9i4tD7rsC7YDG6IcNXtXWCh8VvGaUlVYKTYjQ",
  "token_type": "Bearer",
  "expiry": "2019-05-17T13:28:06.817969+08:00"
}

输出截图:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1, 摘要
    • 2.1 创建文件
      • 2.2 编译和运行
        • 2.3在本地浏览器打开
        • 3,完整四种授权方式代码
          • 3.1 编译/运行授权服务器
            • 3.2 编译/运行客户端服务器
              • 3.3 授权码模式授权测试
                • 3.3.1 浏览器打开
                • 3.3.2 使用access token
                • 3.3.3 更新 access token
              • 3.4 密码授权模式
                • 3.5 凭证式(Client Credentials)授权模式
                相关产品与服务
                访问管理
                访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档