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
相关产品推荐
相关产品推荐

