gpt4 book ai didi

ios - 在 objective-c 中刷新 Gmail API 访问 token 的正确方法

转载 作者:行者123 更新时间:2023-11-29 00:42:51 27 4
gpt4 key购买 nike

我在该方法中获得了访问 token :

- (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController
finishedWithAuth:(GTMOAuth2Authentication *)authResult
error:(NSError *)error {
if (error != nil) {
[self showAlert:@"Authentication Error" message:error.localizedDescription];
self.service.authorizer = nil;
}
else {
self.service.authorizer = authResult;

NSLog(@"Token: %@ id: %@", authResult.accessToken, authResult.userID);
[self makeGmailLabelVisibleWithToken:authResult.accessToken]; //make an authorized request to gmailAPI with the access token

[self dismissViewControllerAnimated:YES completion:nil];

}
}

因此,经过身份验证后一切正常,但过一会儿它就停止工作了(我猜是因为 token 已过期)。另外,如果我使用

[authResult refreshToken]

代替

authResult.accessToken

它不会工作。

那么刷新 Gmail 访问 token 的正确方法是什么,我应该以哪种方法执行此操作?

附言:documentation

- (void) refreshTokensWithHandler:(GIDAuthenticationHandler)handler

应该有帮助,但我还没有找到任何样本。

最佳答案

要获取刷新 token ,您必须为您的应用程序 enable server-side APIA access。“要为您的服务器获取访问 token 和刷新 token ,您可以请求一个一次性授权代码,您的服务器会用该代码交换这两个 token 。您可以通过指定服务器的客户端 ID 以及其他 GIDSignIn 参数来请求一次性代码. 成功连接用户后,您会发现一次性代码作为 auth 参数 server_code 可通过 finishedWithAuth:error 处理程序访问。”

  1. 按照开始集成中的说明配置 iOS 应用项目。
  2. 定义您的应用委托(delegate)的 application:didFinishLaunchingWithOptions: 方法,如上文启用登录中所述,但对于此实现,您将设置 serverClientID 属性,如下所示。
-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

[GIDSignIn sharedInstance].clientID = @"APP_CLIENT_ID";
[GIDSignIn sharedInstance].serverClientID = @"SERVER_CLIENT_ID";

// Additional scopes, if any
// [GIDSignIn sharedInstance].scopes = @[ @"other_scope" ];

return YES;
}
  1. 用户登录后,获取一次性授权码:
-(void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user
withError:(NSError *)error {
// Perform any operations on signed in user here.
// user.serverAuthCode now has a server authorization code!
}
  1. 使用 HTTPS POST 将 serverAuthCode 字符串安全地传递到您的服务器。
  2. 在您应用的后端服务器上,交换访问和刷新 token 的授权码。使用访问 token 代表用户调用 Google API,并且可以选择存储刷新 token 以在访问 token 过期时获取新的访问 token 。

您可以使用 HTTP/REST 调用。

这是 Python 中的 HTTP 调用,只需使用等效的 Objective-C。

import json
import flask
import requests


app = flask.Flask(__name__)

CLIENT_ID = '123456789.apps.googleusercontent.com'
CLIENT_SECRET = 'abc123' # Read from a file or environmental variable in a real app
SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly'
REDIRECT_URI = 'http://example.com/oauth2callback'


@app.route('/')
def index():
if 'credentials' not in flask.session:
return flask.redirect(flask.url_for('oauth2callback'))
credentials = json.loads(flask.session['credentials'])
if credentials['expires_in'] <= 0:
return flask.redirect(flask.url_for('oauth2callback'))
else:
headers = {'Authorization': 'Bearer {}'.format(credentials['access_token'])}
req_uri = 'https://www.googleapis.com/drive/v2/files'
r = requests.get(req_uri, headers=headers)
return r.text


@app.route('/oauth2callback')
def oauth2callback():
if 'code' not in flask.request.args:
auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code'
'&client_id={}&redirect_uri={}&scope={}').format(CLIENT_ID, REDIRECT_URI, SCOPE)
return flask.redirect(auth_uri)
else:
auth_code = flask.request.args.get('code')
data = {'code': auth_code,
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET,
'redirect_uri': REDIRECT_URI,
'grant_type': 'authorization_code'}
r = requests.post('https://www.googleapis.com/oauth2/v4/token', data=data)
flask.session['credentials'] = r.text
return flask.redirect(flask.url_for('index'))


if __name__ == '__main__':
import uuid
app.secret_key = str(uuid.uuid4())
app.debug = False
app.run()

关于ios - 在 objective-c 中刷新 Gmail API 访问 token 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39053958/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com