关闭

Go实战--golang中OAuth2.0的使用(使用google账号进行登陆验证)

标签: oauthgolangoauth2-0google
6966人阅读 评论(0) 收藏 举报
分类:

生命不止,继续 go go go!!!

今天继续分享golang中的认证问题,之前写过两篇:

一篇是关于basic认证:Go实战–通过basic认证的http(basic authentication)

一篇是关于JWT的:Go实战–golang中使用JWT(JSON Web Token)

这里就介绍一下golang中使用oauth2.0.

OAuth2.0

OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。2012年10月,OAuth 2.0协议正式发布为RFC 6749.

在认证和授权的过程中涉及的三方包括:
1、服务提供方,用户使用服务提供方来存储受保护的资源,如照片,视频,联系人列表。
2、用户,存放在服务提供方的受保护的资源的拥有者。
3、客户端,要访问服务提供方资源的第三方应用,通常是网站,如提供照片打印服务的网站。在认证过程之前,客户端要向服务提供者申请客户端标识。

使用OAuth进行认证和授权的过程如下所示:

(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源

这里写图片描述

更详细的内容,可以参考:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

package oauth2

Package oauth2 provides support for making OAuth2 authorized and authenticated HTTP requests. It can additionally grant authorization with Bearer JWT.

获取:

go get golang.org/x/oauth2

type Config

type Config struct {
    // ClientID is the application's ID.
    ClientID string

    // ClientSecret is the application's secret.
    ClientSecret string

    // Endpoint contains the resource server's token endpoint
    // URLs. These are constants specific to each server and are
    // often available via site-specific packages, such as
    // google.Endpoint or github.Endpoint.
    Endpoint Endpoint

    // RedirectURL is the URL to redirect users going through
    // the OAuth flow, after the resource owner's URLs.
    RedirectURL string

    // Scope specifies optional requested permissions.
    Scopes []string
}

func (*Config) AuthCodeURL

func (c *Config) AuthCodeURL(state string, opts ...AuthCodeOption) string

AuthCodeURL returns a URL to OAuth 2.0 provider’s consent page that asks for permissions for the required scopes explicitly.

func (*Config) Exchange

func (c *Config) Exchange(ctx context.Context, code string) (*Token, error)

Exchange converts an authorization code into a token.

type Endpoint

type Endpoint struct {
    AuthURL  string
    TokenURL string
}

Endpoint contains the OAuth 2.0 provider’s authorization and token endpoint URLs.

使用google账号进行登陆验证

1.去Google Cloud Platform,创建一个项目

2.凭据,创建凭据,选择OAuth客户端ID
这里写图片描述

3.
选择应用类型为”网页应用”
输入JavaScript来源:http://localhost:8000
输入已获授权的重定向URI:http://localhost:8000/GoogleCallback
这里写图片描述

4.记录下客户端ID和客户端密钥
这里写图片描述

编码

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"

    "golang.org/x/oauth2"
)

const htmlIndex = `<html><body>
<a href="/GoogleLogin">Log in with Google</a>
</body></html>
`

var endpotin = oauth2.Endpoint{
    AuthURL:  "https://accounts.google.com/o/oauth2/auth",
    TokenURL: "https://accounts.google.com/o/oauth2/token",
}

var googleOauthConfig = &oauth2.Config{
    ClientID:     "your_client_id",
    ClientSecret: "your_client_secret",
    RedirectURL:  "http://localhost:8000/GoogleCallback",
    Scopes: []string{"https://www.googleapis.com/auth/userinfo.profile",
        "https://www.googleapis.com/auth/userinfo.email"},
    Endpoint: endpotin,
}

const oauthStateString = "random"

func main() {
    http.HandleFunc("/", handleMain)
    http.HandleFunc("/GoogleLogin", handleGoogleLogin)
    http.HandleFunc("/GoogleCallback", handleGoogleCallback)
    fmt.Println(http.ListenAndServe(":8000", nil))
}

func handleMain(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, htmlIndex)
}

func handleGoogleLogin(w http.ResponseWriter, r *http.Request) {
    url := googleOauthConfig.AuthCodeURL(oauthStateString)
    fmt.Println(url)
    http.Redirect(w, r, url, http.StatusTemporaryRedirect)
}

func handleGoogleCallback(w http.ResponseWriter, r *http.Request) {
    state := r.FormValue("state")
    if state != oauthStateString {
        fmt.Printf("invalid oauth state, expected '%s', got '%s'\n", oauthStateString, state)
        http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
        return
    }
    fmt.Println(state)

    code := r.FormValue("code")
    fmt.Println(code)
    token, err := googleOauthConfig.Exchange(oauth2.NoContext, code)
    fmt.Println(token)
    if err != nil {
        fmt.Println("Code exchange failed with '%s'\n", err)
        http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
        return
    }

    response, err := http.Get("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + token.AccessToken)

    defer response.Body.Close()
    contents, err := ioutil.ReadAll(response.Body)
    fmt.Fprintf(w, "Content: %s\n", contents)
}

把ClientID和ClientSecret换成你自己的!!!

浏览器访问:http://localhost:8000

点击Log in with Google

结果:

Content: {
 "id": "114512230444013345330",
 "email": "wangshubo1989@126.com",
 "verified_email": true,
 "name": "王书博",
 "given_name": "书博",
 "family_name": "王",
 "picture": "https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg",
 "locale": "zh-CN"
}

这里写图片描述

1
0
查看评论

使用golang快速开发微信公众平台(四):网页授权

我们在使用golang快速开发微信公众平台(三):定制菜单中已经添加了进入商城的按钮,同时这个按钮在创建的时候也附带有url, 但是你是点不进去的。因为此页面并没有授权。 在开始之前,有几点准备工作: 如果在看这篇文章之前,没有详细看过微信网页授权文档,请停下来立刻去看 如果你跟我之前一样,压根就对...
  • u012210379
  • u012210379
  • 2016-10-12 16:53
  • 2250

为什么全力推荐Golang

为什么全力推荐Golang 转自:  https://zhuanlan.zhihu.com/p/19959647 讨论哪个语言更好,就像在争论姚明和刘翔谁是更优秀的运动员。因为各自的坐标象限不同,常常会陷入一个难有结论怪圈。 所以本文绝不是在说Golang是比其他语言更好的语言。G...
  • yueguanyun
  • yueguanyun
  • 2016-08-06 09:12
  • 471

golang自动登录https连接并解析得到的json返回值

主要演示go语言自动登录HTPPS连接及cookie的使用,如何解析JSON数据
  • appletreesujie
  • appletreesujie
  • 2015-02-08 20:47
  • 4666

Java实现Google第三方登录

其实所有的第三方登录都是基于OAuth协议的,大多数平台都支持OAuth2.0,只有Twitter的是基于OAuth1.0来做的。所以只要弄明白一个,其他的什么qq、微信、微博的第三方登录也都一样。上一篇写的Facebook,现在再写一个Google,两篇都看完的同学就会明白“道理都是相通的”这句话...
  • manongxiaomei
  • manongxiaomei
  • 2017-03-28 11:15
  • 3728

golang 简单的登录操作 http

主函数 main.go // testHtmlLogin project main.go package main import ( "fmt" "io/ioutil" "net/http" "os" ....
  • soekchl521
  • soekchl521
  • 2017-10-26 16:42
  • 258

基于OAUTH2的统一认证的实例解析

非常感谢 http://www.imooc.com/article/10931 在一个单位中,可能是存在多个不同的应用,比如学校会有财务的系统会有学生工作的系统,还有图书馆的系统等等,如果每个系统都用独立的账号认证体系,会给用户带来很大困扰,也给管理带来很大不便。所以需要...
  • HUXU981598436
  • HUXU981598436
  • 2017-03-28 09:25
  • 3325

使用OAuth 2.0访问Google API

从2016年10月20日开始,谷歌将阻止新的OAuth的客户端使用可行的替代方案在平台上使用网页浏览,并将针对现有的OAuth客户端的面向用户的通知进行阶段化。在2017年4月20日,谷歌将开始使用在可行的替代方案的平台上的所有的OAuth客户端的网页浏览来阻止OAuth的请求。并且开始使用OAut...
  • u010263943
  • u010263943
  • 2017-06-05 17:25
  • 362

Google OAuth2 for Android(type of web OAuth)

Google OAuth2 for Android(type of web OAuth)一、应用创建和注册1.登录google登录Google 应用 2.创建项目3.创建OAuth同意屏幕4.创建OAuth客户端 5.查看Google client id 和sercret key二、Androi...
  • WificamSDK7
  • WificamSDK7
  • 2017-01-23 17:05
  • 554

golang 实现 json web token

json web token 简介 json web token 简称 jwt.他是一种轻量级的规范.这种规范允许客户端和服务端之间传递一些非敏感信息. 常用于用户认证和授权系统. jwt组成部分 Header Claims Signature Header 组成部分typ:...
  • hzwy23
  • hzwy23
  • 2016-11-18 23:35
  • 4865

【OAuth2.0】认识和使用OAuth2.0附OAuth实例

1.什么是OAuth2.0OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 OAuth(开放授权)是一个开放标准。允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息。而这种授权无需将用户提供用户名和密码提供给该第三...
  • iceiceicpc
  • iceiceicpc
  • 2017-07-12 14:28
  • 2036
    个人资料
    • 访问:4740582次
    • 积分:42195
    • 等级:
    • 排名:第97名
    • 原创:571篇
    • 转载:29篇
    • 译文:13篇
    • 评论:784条
    微信公众号
      我的微信公众号
      为你推荐最新的博文~更有惊喜等着你
    时光荏苒
      白驹过隙
    博客专栏
    文章分类
    百度统计
    Google Analytics