在没有http.Redirect的情况下实施OAuth2 Facebook登录

时间:2012-12-16 00:17:41

标签: google-app-engine facebook-graph-api go

以下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,就是这样。

1 个答案:

答案 0 :(得分:4)

  

有没有办法使用client.Get等访问授权URL,按照重定向,从生成的查询字符串中获取代码并将其填入字符串以供处理程序使用?

不,因为用户可能必须将他们的登录凭据输入到Facebook(如果他们是第一次使用,也可能连接到您的应用程序) - 如果您从服务器执行此操作,则很难完成没有向用户显示。

如果您想识别现有用户在已经登录Facebook时重新访问您的应用程序 - 这只能在客户端完成。来自JS SDK的FB.getLoginStatus能够为您做到这一点 - 它将识别用户,并同时为他们提供有效的访问令牌。