【发布时间】:2020-06-04 19:35:31
【问题描述】:
我在用验证码交换令牌时遇到问题。以前有没有其他人遇到过类似的错误?我对 OAuth2 非常陌生,必须从头开始学习并在几天内应用它,遗憾的是我公司没有人熟悉 OAuth2。
主包
import (
"fmt"
"golang.org/x/oauth2"
"log"
"math/rand"
"net/http"
)
var (
oAuth2Config= &oauth2.Config{
ClientID: "<client_id>",
ClientSecret: "<client_secret>",
Endpoint: oauth2.Endpoint{
AuthURL: "https://oauth2.provider.no/auth",
TokenURL: "https://oauth2.provider.no/token",
AuthStyle: 1,
},
RedirectURL: "<redirect_uri>",
Scopes: nil,
}
resourceServerURL = "https://api.provider.no"
resourceServerPathCustomers = "/gapi/v1/customers"
resourceServerPathCases = "/gapi/v1/cases"
resourceServerPathAlarms = "/gapi/v1/alarms"
resourceServerPathCIS = "/gapi/v1/cis"
// tokenChan = make(chan *oauth2.Token) // we could possibly send a token here and continue using it.
oAuth2State = randomString(14)
)
func randomString(length int) string {
str := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYZ0123456789"
generatedString := make([]rune, length)
for i := 0; i < len(generatedString); i++ {
generatedString[i] = rune(str[rand.Intn(len(str))])
}
return string(generatedString)
}
func main() {
http.HandleFunc("/", handleCallback)
if err := http.ListenAndServe(":8082", nil); err != nil {
log.Fatal(err)
}
}
func handleCallback(w http.ResponseWriter, r *http.Request) {
_ = Auth2Config.AuthCodeURL(oAuth2State)
if state := r.FormValue("state"); state != OAuth2State {
fmt.Println("state is not valid")
return
}
token, err := oAuth2Config.Exchange(oauth2.NoContext, r.FormValue("code"))
if err != nil {
log.Println(err)
return
}
fmt.Println(token.AccessToken)
}
错误:
2020/03/16 15:49:30 oauth2: cannot fetch token: 400
Response: {"error_description":"Missing grant_type parameter value","error":"invalid_reques│
t"}
【问题讨论】:
-
Exchange sets the grant_type parameter correctly。您必须与非标准服务器打交道。
-
@CeriseLimón 感谢您指出这一点,我在测试阶段忘记删除它。但是删除它并不能解决问题。彼得,我也有这个结论,但是公司的开发人员一直告诉我我错了。
-
不,在此测试阶段我没有其他处理程序,Auth2Config.AuthCodeURL(oAuth2State) 是我在此处发布的代码中留下的错误。 r.FormValue("code") 是授权码。