当前位置: 首页 > 面试题库 >

在不使用http.Redirect的情况下实现OAuth2 Facebook登录

曾河
2023-03-14
问题内容

以下App Engine处理程序在可以获取令牌的范围内起作用:

func home(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)

    oaConfig := map [string]string {
        "ClientID":     "(redacted)",
        "ClientSecret": "(redacted)",
        "Scope":        "email",
        "AuthURL":      "https://graph.facebook.com/oauth/authorize",
        "TokenURL":     "https://graph.facebook.com/oauth/access_token",
        "RedirectURL":  "http://www.example.com/",
    }

    code := r.FormValue("code")
    if code == "" {
        // 1. Code request
        url := oaConfig["AuthURL"] + 
            "?client_id=" + oaConfig["ClientID"] + 
            "&redirect_uri=" + oaConfig["RedirectURL"] + 
            "&state=SOME_UNIQUE_VALUE"
        http.Redirect(w, r, url, http.StatusFound)
    }

    // 2. Token request
    client := urlfetch.Client(c)
    tokenResponse, err := client.PostForm(oaConfig["TokenURL"],
        url.Values{
            "client_id": {oaConfig["ClientID"]},
            "redirect_uri": {oaConfig["RedirectURL"]},
            "client_secret": {oaConfig["ClientSecret"]},
            "code": {code},
        })

    if err != nil {
        // ...
    } else {
        // 3. Read token from response body
        defer tokenResponse.Body.Close()
        body, err := ioutil.ReadAll(tokenResponse.Body)
        if err != nil {
            // ...
        } else {
            token := string(body)
        }
    }

    // ...
}

当连接到模板时,它会从Facebook获得令牌响应并愉快地显示它。但是,最好不要将用户重定向到example.com/?state=SOME_UNIQUE_VALUE&code=AQB0iYpAf8nMmX5blahblah#
= 来完成登录。

有没有一种方法可以使用client.Get等来访问授权URL,遵循重​​定向,从结果查询字符串中获取代码并将其填充到字符串中以供处理程序使用?无需求助于Ajax。


问题答案:

有没有一种方法可以使用client.Get等来访问授权URL,遵循重​​定向,从结果查询字符串中获取代码并将其填充到字符串中以供处理程序使用?

否,因为用户可能必须将其登录凭据输入到Facebook(如果是首次使用,则可能也连接到您的应用程序)–如果您在服务器上不显示所有操作就很难做到这一点给用户。

如果您想识别已经登录Facebook的现有用户,请重新访问您的应用程序-只能在客户端进行。FB.getLoginStatusJS
SDK提供的功能可以帮助您–它会识别用户,并同时为他们提供有效的访问令牌。



 类似资料:
  • 问题内容: 如果我要使用DefaultServeMux(我将其指定为ListenAndServe的第二个参数来指定),那么我可以访问,您可以在Go Wiki的以下示例中看到该: 在当前代码中,我无法使用DefaultServeMux,即我将自定义处理程序传递给ListenAndServe 因此,我没有内置的代码。但是,我必须将一些授权代码修改为需要类似的授权代码。例如,如果我一直在使用Defaul

  • 问题内容: 是否可以在不实现Comparable类的情况下使用Comparator?例如,如果我有以下内容: 然后可以使用comp比较两个对象吗?如果是这样,我将如何去做? 谢谢… 问题答案: 你不用。您使用。 是由对象实现的接口,用于指定它们与相同类型的其他对象的排序顺序。 是一个通用接口,只需要两个对象并告诉您它们的排序顺序。因此,您可以执行以下操作: 与: 和:

  • 问题内容: 我想知道是否有一种方法可以在不使用内置函数的情况下实现SQL分析功能。 问题答案: 这是三个等效的表达式: 假设存在,以使行对于“ row_number”而言是唯一的。

  • 我想使用Cognito对我的用户进行身份验证,这是一个内置于Flutter和Dart的应用程序。 不幸的是,Dart不存在本机AWS SDK,我不能在颤振中使用JS互操作。 我已经研究了OAuth2流,但这需要将我的用户重定向到登录表单,这对移动应用程序来说不是很好。 有哪些替代方案?

  • 我的大学教授给我布置了一个练习,内容如下: “Geofence对象是一个对象,它有一个对象集合,可以在这些对象发出信号时等待。有一个add(object)方法,它将对象添加到集合中。还有一个await()方法:它允许等待集合中的任何对象发出信号。每当调用add(object)方法时,await()方法处于活动状态时,add的参数将放入队列中。使用以下接口编写源代码:“。 因此,只有当调用相同数量的

  • 问题内容: 我想知道是否可以在没有支持库的情况下使用FragmentStatePagerAdapter类或其等效类? 我知道如何使用本机片段代替支持库中的本机片段,许多其他类也具有类似的等效项,但是我找不到代替该类的内容。 我基本上想扩展它以便在我的适配器中使用,就像这样 问题答案: 我想您已经阅读了 docs,但以防万一: 该课程目前正在早期设计和开发中。该API可能会在以后的兼容性库更新中更改