You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET WebForms中如何从Google Sign-In获取refresh_token?

How to get refresh_token for Google Calendar API in ASP.NET WebForms?

我使用ASP.NET WebForms创建了一个原型,用于请求用户授权以访问其Google Calendar。代码运行正常,但Google返回的响应仅包含access_token和id_token,未找到refresh_token,请问如何获取它?

我的代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="GoogleSignInDemo.WebForm1" %> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <meta name="google-signin-scope" content="profile email"> 
    <meta name="google-signin-client_id" content="CLIENT_ID.apps.googleusercontent.com"> 
    <script src="https://apis.google.com/js/platform.js" async defer></script> 
    <script src="Resources/jquery.js" ></script> 
</head> 
<body> 
    <div class="g-signin2" data-theme="dark" onclick="onSignInCalendar()"></div> 
    <script> 
        function onSignInCalendar() { 
            var auth2 = gapi.auth2.getAuthInstance(); 
            var options = new gapi.auth2.SigninOptionsBuilder( { 
                'scope': 'email https://www.googleapis.com/auth/calendar' 
            }); 
            googleUser = auth2.currentUser.get(); 
            googleUser.grant(options).then( 
                function (success) { 
                    console.log(JSON.stringify({ message: "success", value: success })); 
                    var accessToken = success.Zi.access_token; 
                    var idToken = success.Zi.id_token; 
                }, 
                function (fail) { 
                    alert(JSON.stringify({ message: "fail", value: fail })); 
                } 
            ); 
        } 
    </script> 
</body> 
</html>

Answer

要拿到Google OAuth的refresh_token,你需要满足两个核心条件,我来帮你修改代码解决这个问题:

  • 必须指定access_type=offline:这是告诉Google你需要离线访问权限,只有添加这个参数,Google才会返回refresh_token,用来在access_token过期后自动刷新凭证。
  • 添加prompt=consent参数:如果用户之前已经授权过你的应用,默认情况下Google不会重复返回refresh_token。这个参数会强制用户重新确认授权,确保每次请求都能拿到refresh_token(适合开发调试阶段,上线后可根据需求调整)。

修改后的JavaScript代码

function onSignInCalendar() { 
    var auth2 = gapi.auth2.getAuthInstance(); 
    var options = new gapi.auth2.SigninOptionsBuilder( { 
        'scope': 'email https://www.googleapis.com/auth/calendar',
        'access_type': 'offline', // 开启离线访问,关键参数
        'prompt': 'consent'       // 强制用户重新授权,确保返回refresh_token
    }); 
    googleUser = auth2.currentUser.get(); 
    googleUser.grant(options).then( 
        function (success) {
            // 不要依赖内部属性如Zi,用官方API方法获取更稳定
            var authResponse = success.getAuthResponse(true); // true表示包含refresh_token
            console.log(JSON.stringify({ 
                message: "success", 
                access_token: authResponse.access_token,
                id_token: authResponse.id_token,
                refresh_token: authResponse.refresh_token // 现在这里就能拿到了
            })); 
        }, 
        function (fail) { 
            alert(JSON.stringify({ message: "fail", value: fail })); 
        } 
    ); 
} 

额外注意事项

  • 生产环境建议不要一直用prompt=consent,否则用户每次登录都要重复授权,体验不佳。可以改成prompt=select_account或者直接去掉,只在用户首次授权、需要重置凭证时使用prompt=consent。
  • 确保你的Google Cloud Console项目中,已经启用了Google Calendar API,并且OAuth客户端ID的配置(如授权回调地址)完全正确。

内容的提问来源于stack exchange,提问作者Yusril Maulidan Raji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:41:08