func handleOAuthCallback(oauthClient *oauth.Client, s sessions.Session, w http.ResponseWriter, r *http.Request) { nextURL := getNextURL(r) tempToken, err := unmarshalCredentials(s, keyTempToken) if err != nil { // missing temp token params := url.Values{} params.Add(KeyNextURL, nextURL) http.Redirect(w, r, PathLogin+"?"+params.Encode(), codeRedirect) return } if tempToken.Token != r.FormValue("oauth_token") { // TODO: add error handling log.Fatal("oauth token mismatch") } token, _, err := oauthClient.RequestToken(http.DefaultClient, tempToken, r.FormValue("oauth_verifier")) if err != nil { // TODO: add error handling log.Fatal("oauth-callback error:", err) // http.Redirect(w, r, PathError, codeRedirect) return } // Store the credentials in the session. marshalCredentials(token, s, keyToken) http.Redirect(w, r, nextURL, codeRedirect) }
// You get a token for your App from Twitter. Put this within the App section // of the JSON token file. The user's token will be requested, then written // and saved to this file. func (t *ClientTokens) Token(oc *oauth.Client) (*oauth.Credentials, error) { if t.TokenFile == "" { return nil, &ClientTokensError{ Msg: "no token file supplied", } } cf, err := ioutil.ReadFile(t.TokenFile) if err != nil { return nil, err } if err := json.Unmarshal(cf, t); err != nil { return nil, err } if t.App == nil { return nil, &ClientTokensError{ Msg: "missing \"App\" token", } } if t.App.Token == "" || t.App.Secret == "" { return nil, &ClientTokensError{ Msg: "missing app's Token or Secret", } } oc.Credentials = *t.App var token *oauth.Credentials if t.User == nil { token = &oauth.Credentials{} } else { token = t.User } if token.Token == "" || token.Secret == "" { tempCredentials, err := oc.RequestTemporaryCredentials(http.DefaultClient, "oob", nil) if err != nil { return nil, err } url := oc.AuthorizationURL(tempCredentials, nil) fmt.Fprintf(os.Stdout, "Before we can continue ...\nGo to:\n\n\t%s\n\nAuthorize the application and enter in the verification code: ", url) var authCode string fmt.Scanln(&authCode) token, _, err = oc.RequestToken(http.DefaultClient, tempCredentials, authCode) if err != nil { return nil, err } // Save the user token within our token file t.User = token save, err := json.Marshal(t) if err != nil { return nil, err } if err := ioutil.WriteFile(t.TokenFile, save, tokenFilePermission); err != nil { return nil, err } } return token, nil }