oauth2.0 Google身份服务SDK -弹出模式中的授权代码模型-如何请求刷新/访问令牌?

b4qexyjb  于 2022-12-03  发布在  Go
关注(0)|答案(1)|浏览(170)

我正在尝试使用Google身份服务SDK实现授权代码模型,如Use Code Model中所述。我希望使用弹出模式。
我设法初始化了代码客户端,并收到了一个包含以下Javascript代码的授权代码:

tokenClient = google.accounts.oauth2.initCodeClient({
  client_id: CLIENT_ID,
  scope: SCOPES,
  callback: '', // defined later
  ux_mode: 'popup',
})

...

tokenClient.requestCode({prompt: 'consent'});

当我在回调中收到授权代码时,我将它中继到我的平台上的端点,如步骤5:交换刷新和访问令牌的授权代码,我尝试用Python交换刷新和访问令牌的授权代码:

flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=scopes,
    state=state
    redirect_uri=redirect_uri
)

flow.fetch_token(code=code)

问题是我使用这个代码时redirect_uri是空的,我会得到一个错误“missing redirect_uri parameter”。如果我指定了一个在Google Cloud Console中定义的重定向URL,我会得到一个错误“redirect_uri mismatch”。如果我尝试使用与初始弹出请求中发送的redirect_uri相同的redirect_uri(在这种情况下,Google似乎使用storagerelay://...),我得到一个错误,“它不符合Google Oauth2策略”。

jtoj6r0c

jtoj6r0c1#

在任何授权流中,当您在客户端获得授权码,然后将其传递给服务器进行令牌交换时,似乎都必须使用字符串文字"postmessage"作为redirect_uri的设置。

flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=scopes,
    state=state
    redirect_uri="postmessage"
)

flow.fetch_token(code=code)

奇怪的是,大多数google客户端库的文档中似乎都没有这个非常重要的事实,但它对我很有效。希望这能有所帮助!

相关问题