使用Google OpenID服务器端流程

时间:2018-11-13 02:40:11

标签: google-openid

我正在努力了解如何实现此目标:

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流程。我正努力避免这种情况。

0 个答案:

没有答案