1

ユーザーの OAuth2 ログインを処理するためにgosimple/oauth2パッケージを使用しています。GitHubのサンプル コードに問題はありません。これは完全に機能し、必要なものを返します。

ただし、Google で動作させるには問題があります。スコープを正しく定義し (私が見る限り)、トークンの応答を取得していますが、入力すると、68 行目でアプリケーションがパニックになります。

package main

import (
    "bitbucket.org/gosimple/oauth2"
    "flag"
    "fmt"
    "io"
    "log"
    "os"
)

var (
    // Register new app at https://github.com/settings/applications and provide
    // clientId (-id), clientSecret (-secret) and redirectURL (-redirect)
    // as imput arguments.
    clientId     = flag.String("id", "", "Client ID")
    clientSecret = flag.String("secret", "", "Client Secret")
    redirectURL  = flag.String("redirect", "http://httpbin.org/get", "Redirect URL")
    scopeURL     = flag.String("scope", "https://www.googleapis.com/auth/userinfo.profile", "Scope URL")

    authURL    = "https://accounts.google.com/o/oauth2/auth"
    tokenURL   = "https://www.googleapis.com/oauth2/v1/userinfo"
    apiBaseURL = "https://www.googleapis.com/"
)

const startInfo = `
Register new app at https://github.com/settings/applications and provide
-id, -secret and -redirect as input arguments.
`

func main() {
    flag.Parse()

    if *clientId == "" || *clientSecret == "" {
        fmt.Println(startInfo)
        flag.Usage()
        os.Exit(2)
    }

    // Initialize service.
    service := oauth2.Service(
        *clientId, *clientSecret, authURL, tokenURL)
    service.RedirectURL = *redirectURL
    service.Scope = *scopeURL

    // Get authorization url.
    aUrl := service.GetAuthorizeURL("")
    fmt.Println("\n", aUrl)

    // Open authorization url in default system browser.
    //webbrowser.Open(url)

    fmt.Printf("\nVisit URL and provide code: ")
    code := ""
    // Read access code from cmd.
    fmt.Scanf("%s", &code)
    // Get access token.
    token, _ := service.GetAccessToken(code)
    fmt.Println()

    // Prepare resource request.
    google := oauth2.Request(apiBaseURL, token.AccessToken)
    google.AccessTokenInHeader = false
    google.AccessTokenInHeaderScheme = "token"
    //google.AccessTokenInURL = true

    // Make the request.
    apiEndPoint := "user"
    googleUserData, err := google.Get(apiEndPoint)
    if err != nil {
        log.Fatal("Get:", err)
    }
    defer googleUserData.Body.Close()

    fmt.Println("User info response:")
    // Write the response to standard output.
    io.Copy(os.Stdout, googleUserData.Body)

    fmt.Println()
}

そしてパニック:

panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x0 pc=0x2341]

これは問題のある行です:

google := oauth2.Request(apiBaseURL, token.AccessToken)

これを機能させるための助けをいただければ幸いです。gosimple/oauth2このコードは、アプリケーションのコントローラー メソッドでラップする前に、このステージをデバッグしようとしているレポのサンプル コードを変更しただけであることに注意してください。

以下の完全なスタック トレース:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x2341]

goroutine 1 [running]:
main.main()
        /Users/matt/Desktop/tests/google_demo.go:68 +0x341

goroutine 2 [syscall]:

goroutine 5 [runnable]:
net/http.(*persistConn).readLoop(0xc2000bd100)
        /usr/local/Cellar/go/1.1/src/pkg/net/http/transport.go:761 +0x64b
created by net/http.(*Transport).dialConn
        /usr/local/Cellar/go/1.1/src/pkg/net/http/transport.go:511 +0x574

goroutine 6 [select]:
net/http.(*persistConn).writeLoop(0xc2000bd100)
        /usr/local/Cellar/go/1.1/src/pkg/net/http/transport.go:774 +0x26f
created by net/http.(*Transport).dialConn
        /usr/local/Cellar/go/1.1/src/pkg/net/http/transport.go:512 +0x58b

...そしてトークンエラーでパニックを強制します:

panic: No access token found, response: [78 111 116 32 70 111 117 110 100]

4

1 に答える 1

0

これは、ライブラリのトークン処理のバグによるもので、作者と一緒にログに記録し、その日のうちに修正されました:

于 2013-05-20T22:10:42.470 に答える