我正在努力了解如何实现此目标:
https://developers.google.com/identity/sign-in/web/server-side-flow
主要问题在于redirect_uri。上面的链接声称:
“授权重定向URI”字段不需要值。重新导向 URI不能与JavaScript API一起使用。
进一步,它对服务器端的REDIRECT_URI表示以下内容:
指定与Web应用程序一起使用的相同重定向URI。如果 您没有应用的网络版本,则可以指定一个空白 字符串。
如果使用gapi发出grantOfflineAccess
请求时没有提供redirect_uri,则代码直接返回到我的javascript应用程序,但是当我尝试在服务器端将代码交换为访问令牌时,会收到如果我在该请求中提供了一个空字符串,则会出现“缺少参数:redirect_uri”错误。
更多详细信息:
我有一个由REST API支持的SPA。在前端,我正在使用
window.gapi.load('auth2', () => {
// if GoogleAuth, this will return undefined - means init must be called
if (!window.gapi.auth2.getAuthInstance()) {
window.gapi.auth2.init({
client_id: clientId,
profile: 'profile email'
})
.then(res => {
this.isReady(true);
})
.catch(err => this.props.onFailure(err))
} else {
this.isReady(true);
}
});
当用户想要登录时,我只需拨打以下电话:
auth2.grantOfflineAccess()
.then(res => {
onSuccess(res)
})
.catch(err => onFailure(err))
到目前为止,res主体中包含一个“代码”。我将该代码传递给后端api。这就是事情变糟的地方。我使用Go的golang.org/x/oauth2/google库尝试将代码交换为请求令牌。
conf := &oauth2.Config{
ClientID: auth.config.ClientID,
ClientSecret: auth.config.ClientSecret,
RedirectURL: "",
Scopes: []string{"profile", "email"},
Endpoint: google.Endpoint,
}
token, err := conf.Exchange(context.Background(), code)
令牌始终为nil,错误状态为“缺少参数:redirect_uri”。我尝试直接执行请求,结果是相同的:
curl -XPOST https://www.googleapis.com/oauth2/v4/token -H 'Content-Type: application/x-www-form-urlencoded' -d 'code=<code>&client_id=<clientid>&client_secret=<client_secret>&redirect_uri=&grant_type=authorization_code'
如果我提供redirect_uri,那么代码将直接发送到我的REST API,这会将我带出UI流程。我正努力避免这种情况。