使用 golang.org/x/oauth2 进行 golang Facebook 身份验证

2024-03-03

我正在尝试使用以下方法编写一个简单的程序golang.org/x/oauth2包裹。但我似乎无法用代码交换访问令牌。以下错误有点误导,因为它表示授权代码已被使用,但每次调用登录对话框时我都会看到一个新代码。我是 golang 新手,我可能会犯一个基本错误,任何指示都会非常有帮助:)

    clientOptions, err = oauth2.New(
        oauth2.Client("xxxxxx", "22222222222222"),
        oauth2.RedirectURL("http://localhost:3000/auth/cb/fb2"),
        oauth2.Scope("public_profile", "email", "user_friends"),
        oauth2.Endpoint(
            "https://www.facebook.com/dialog/oauth",
            "https://graph.facebook.com/oauth/access_token",
        ),
    )

func handleFBSetupOauth(w http.ResponseWriter, r *http.Request) {
    url := clientOptions.AuthCodeURL("state", "online", "auto")
    fmt.Printf("Visit the URL for the auth dialog: %v", url)

    http.Redirect(w, r, url, http.StatusFound)
}

func handleFBOauthCB(w http.ResponseWriter, r *http.Request) (int, string) {
    var err error

    code := r.FormValue("code")
    if code == "" {
        return 500, "No code!"
    }

    fmt.Printf("code - %s", code)

    t, err := clientOptions.NewTransportFromCode(code)
    if err != nil {
        log.Fatal(err)
    }

    client := http.Client{Transport: t}

    url := "https://graph.facebook.com/oauth/access_token?client_id=xxxxxxx&redirect_uri=http://localhost:3000/auth/cb/fb2&client_secret=22222222&code=" + code + ""

    resp, err := client.Get(url)

我从上次获取请求中收到以下错误 -

{"error":{"message":"此授权码已被使用。","type":"OAuthException","code":100}}

我正在遵循这两个指南 - Facebook 登录流程 -https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/v2.2 https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/v2.2

最新的 goauth 文档 -https://godoc.org/golang.org/x/oauth2 https://godoc.org/golang.org/x/oauth2


这是一个帮助您入门的简单示例:

package main

import (
  "fmt"
  "io/ioutil"
  "log"
  "net/http"
  "net/url"
  "strings"

  "golang.org/x/oauth2"
  "golang.org/x/oauth2/facebook"
)

var (
  oauthConf = &oauth2.Config{
    ClientID:     "YOUR_CLIENT_ID",
    ClientSecret: "YOUR_CLIENT_SECRET",
    RedirectURL:  "YOUR_REDIRECT_URL_CALLBACK",
    Scopes:       []string{"public_profile"},
    Endpoint:     facebook.Endpoint,
  }
  oauthStateString = "thisshouldberandom"
)

const htmlIndex = `<html><body>
Logged in with <a href="/login">facebook</a>
</body></html>
`

func handleMain(w http.ResponseWriter, r *http.Request) {
  w.Header().Set("Content-Type", "text/html; charset=utf-8")
  w.WriteHeader(http.StatusOK)
  w.Write([]byte(htmlIndex))
}

func handleFacebookLogin(w http.ResponseWriter, r *http.Request) {
  Url, err := url.Parse(oauthConf.Endpoint.AuthURL)
  if err != nil {
    log.Fatal("Parse: ", err)
  }
  parameters := url.Values{}
  parameters.Add("client_id", oauthConf.ClientID)
  parameters.Add("scope", strings.Join(oauthConf.Scopes, " "))
  parameters.Add("redirect_uri", oauthConf.RedirectURL)
  parameters.Add("response_type", "code")
  parameters.Add("state", oauthStateString)
  Url.RawQuery = parameters.Encode()
  url := Url.String()
  http.Redirect(w, r, url, http.StatusTemporaryRedirect)
}

func handleFacebookCallback(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
  }

  code := r.FormValue("code")

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

  resp, err := http.Get("https://graph.facebook.com/me?access_token=" +
    url.QueryEscape(token.AccessToken))
  if err != nil {
    fmt.Printf("Get: %s\n", err)
    http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
    return
  }
  defer resp.Body.Close()

  response, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    fmt.Printf("ReadAll: %s\n", err)
    http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
    return
  }

  log.Printf("parseResponseBody: %s\n", string(response))

  http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
}

func main() {
  http.HandleFunc("/", handleMain)
  http.HandleFunc("/login", handleFacebookLogin)
  http.HandleFunc("/oauth2callback", handleFacebookCallback)
  fmt.Print("Started running on http://localhost:9090\n")
  log.Fatal(http.ListenAndServe(":9090", nil))
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 golang.org/x/oauth2 进行 golang Facebook 身份验证 的相关文章

  • 使用 Web API AuthorizeAttribute 角色的 Azure AD OAuth 客户端凭据授予流程

    Given 我们有 NET Web API 服务 它使用以下方式保护对控制器和操作的访问授权属性 https learn microsoft com en us dotnet api system web mvc authorizeattr
  • ApplicationController 的未定义方法“helper_method”,Rails 5

    我正在尝试使用doorkeeper 将oAuth2 0 集成到我的仅rails api 应用程序中 但我不断收到此错误 ApplicationController 的未定义方法 helper method 但无法找到解决该问题的明确解决方案
  • Facebook API Javascript JSON 响应

    function getUser FB api me function response console log Response is response alert Your name is response first name ale
  • Golang 正则表达式命名组和子匹配

    我正在尝试匹配正则表达式并获取匹配的捕获组名称 当正则表达式仅与字符串匹配一次时 这是有效的 但如果它与字符串匹配多次 SubexpNames不返回重复的名称 这是一个例子 package main import fmt regexp fu
  • 使用 HTTPS GRC 从 AWS Codecommit 获取私有存储库

    我正在尝试导入位于 AWS codecommit 中的模块 为了克隆存储库 我使用 HTTPS GRC Git 远程代码提交 方法 该方法使用 Google Suite 凭证来访问 AWS 控制台 我用来克隆存储库的命令是 git clon
  • 解组转义 XML

    在 Go 中 我将如何解码此 XML 响应 我尝试过建立一个自定义UnMarshal方法在我的Answerstruct 但我运气不太好
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 如何从 Facebook 邀请好友到 Android 应用程序? - 给出错误

    我正在开发一个 Android 应用程序 我正在努力将 邀请朋友 功能添加到我的应用程序中 它转到我的AppLinkUrl成功但显示错误 我的清单代码如下
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • Golang 正则表达式在字符串之间替换

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替
  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 雅虎 OAuth2 隐式授予流程不适用于新的雅虎应用程序

    我有现有的网络应用程序和专用雅虎应用程序 https developer yahoo com apps 在职的 它用OAuth2 隐式授权流程 https developer yahoo com oauth2 guide flows imp
  • 在 Gorilla Mux 中嵌套子路由器

    我一直在使用gorilla mux https github com gorilla mux满足我的路由需求 但我注意到一个问题 当我嵌套多个子路由器时它不起作用 这是示例 func main r mux NewRouter StrictS
  • 在 Go 中,如何将结构体转换为字节数组?

    我有一个我定义的结构实例 我想将其转换为字节数组 我尝试了 byte my struct 但这不起作用 另外 我还被指出二进制包 http golang org pkg encoding binary 但我不确定我应该使用哪个函数以及应该如
  • 使用 Instagram Basic Display API 时出现“无效平台应用程序”错误

    我正在尝试使用 Instagram Basic 显示 API 但是当我发布授权代码以获取访问令牌时 我不断收到以下错误 error type OAuthException 代码 400 error message 平台应用无效 我正在遵循此
  • Facebook PHP SDK - 如何获取访问令牌?

    我正在尝试从我的应用程序在用户的 Facebook 墙上发帖 用户授予应用程序在他的墙上发布的权限 并且我在数据库中有用户ID 我需要自动发送帖子 而无需用户再次登录 我的代码是 try require once dirname FILE
  • select 语句是否保证通道选择的顺序?

    继从这个答案 https stackoverflow com a 25795236 274460 如果一个 goroutine 在两个通道上进行选择 是否保证通道的选择顺序与其发送的顺序相同 我对发送者是单线程的情况特别感兴趣 例如 是否保

随机推荐

  • Android 浏览器中的 SVG

    我知道它本身不支持 但是是否有任何 JS Shims 可以渲染到画布对象或允许我在本机 Android 浏览器上渲染 SVG 的东西 不是 Opera 等 因为我想避免用户需要安装另一个浏览器 我想你想要的是这个库 http code go
  • 多项式回归废话预测

    假设我想用二次 正交 多项式拟合线性回归模型 然后预测响应 这是第一个模型 m1 的代码 x 1 100 y 2 3 x 5 x 2 rnorm 100 m1 lm y poly x 2 prd 1 predict m1 newdata d
  • 实体框架,代码优先:将主从与零对一关系相结合

    我使用代码优先 EF 有一个简单的主从关系 public class User public string Id get set public ICollection
  • 如何将多个 FlowDocument 连接成 1 个 FlowDocument

    我有多个 FlowDocument 我想将它们连接在一起 下面的方法没有 return 语句 我想做的是将 TextRange 转回 FlowDocument private FlowDocument Concatenate FlowDoc
  • if(!isset($_SESSION['username'])) 导致用户从 verify_login_form.php 重定向回 index.php

    我的网站上有一个登录系统 它将用户从 index php 带到 verify login form php 然后 如果电子邮件 用户名组合与帐户匹配 它们就会被带到 home php 我遇到的问题是我有 if isset SESSION u
  • Eclipse Java启动配置文件路径

    我正在寻找 Eclipse 存储其启动配置的文件 我正在 Ubuntu 中进行一些 Java 开发 我正在开发的一个可执行文件需要另一个可执行文件的输出作为它的参数 也就是说 B 的输出需要作为命令行参数传递给 A 在Eclipse中 我不
  • 从 C DLL 到 .NET 的接口

    我有一个用 C 编写的遗留 DLL 我想从 C NET 应用程序调用它 问题是 C DLL 的 DLL 接口相当复杂 是这样的 declspec dllexport void stdcall ProcessChunk void p proc
  • 如何在 Mac OS X Snow Leopard 中运行 XUL 应用程序?

    我正在尝试在 Mac OS X 中创建 XUL Hello World 应用程序 我从以下位置下载 XULRunnerhere http releases mozilla org pub mozilla org xulrunner rele
  • 从使用 (WHERE) 条件选择的行中获取上一行和下一行

    例如我有这样的说法 my name is Joseph and my father s name is Brian 该语句按单词拆分 如下表 ID word 1 my 2 name 3 is 4 Joseph 5 and 6 my
  • JAX-RS 中必需的 @QueryParam(以及在缺少 @QueryParam 时该怎么做)

    我部署了一个网络服务组件JBoss 应用服务器 7使用RETEasy JAX RS执行 是否有注释可以声明必需的 强制的 查询参数参数在JAX RS 如果没有 处理缺少此类参数的情况的 标准 方法是什么 当使用所有强制参数正确调用时 我的
  • 亚马逊 EC2 延迟

    同一区域中一对 Amazon EC2 实例之间的简单连接的预期延迟是多少 Thanks 延迟应类似于同一 LAN 中两台计算机的延迟 只需确保在连接两个映像时使用的是私有 IP 而不是公共 IP
  • Java ProcessBuilder:引号内有空格

    我正在使用 ProcessBuilder 运行 FFMPEG 来转换和标记我的一些 MP3 文件 在 bat 文件中手动使用以下内容可以按预期工作 E Dokumente workspace MusicBot ffmpeg bin ffmp
  • 使用scrapyd部署项目出错

    我的项目文件夹中有多个蜘蛛 并且希望立即运行所有蜘蛛 因此我决定使用 scrapyd 服务运行它们 我开始这样做是因为看到here http scrapy readthedocs org en 0 7 topics scrapyd html
  • Django - URL 模式正则表达式不匹配带重音的字符串参数

    我在将带重音符号的字符串参数传递到 Django 应用程序时遇到一些问题 我有以下网址模式 url r galeria P
  • openpyxl - 覆盖数据表并保留数据透视表

    我已经看到了这个问题的一些答案 但没有一个有效 例如 如何使用 openpyxl 写入现有 Excel 文件而不破坏公式 https stackoverflow com questions 20262448 how to write to
  • 如何关闭selenium运行时弹出的窗口?

    我想关闭弹出窗口 已知窗口名称 然后返回到原始窗口 我该怎么办 如果我无法获得窗口中关闭按钮的常量 那么有什么一般行为可以达到目标吗 使用WebDriver 用Java显示 你可以做这样的事情 instantiate your driver
  • .NET 中“托管”资源与“非托管”资源是什么意思?

    NET 中术语托管资源和非托管资源是什么意思 他们是如何出现的 术语 非托管资源 通常用于描述某些事物不直接受垃圾收集器控制 例如 如果您打开到数据库服务器的连接 这将使用服务器上的资源 用于维护连接 以及客户端计算机上可能的其他非 net
  • Integer.Parse 与 CInt

    基本上这两个我都用过Integer Parse and CInt https msdn microsoft com en us library s2dy91zy aspx在我的大多数日常编程任务中 但我对两者之间的区别有点困惑 有什么区别I
  • 跨子域的 ASP.NET 身份 Cookie

    对于表单身份验证 我在 web config 中使用了它 注意域属性
  • 使用 golang.org/x/oauth2 进行 golang Facebook 身份验证

    我正在尝试使用以下方法编写一个简单的程序golang org x oauth2包裹 但我似乎无法用代码交换访问令牌 以下错误有点误导 因为它表示授权代码已被使用 但每次调用登录对话框时我都会看到一个新代码 我是 golang 新手 我可能会