Google Api 在我有 access_token 之前需要 userId
Google Api requires userId before I have access_token
我收到了我的 authorization code
并想在服务器上将其兑换成 authorization token
。 .NET Google API 在流程 class 中有 ExchangeCodeForTokenAsync
方法。似乎是我需要的,但它需要 userId 作为其参数之一。
var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "...",
ClientSecret = "..."
},
Scopes = new[] { "some scopes" },
});
flow.ExchangeCodeForTokenAsync(userId, code, "redirect url", CancellationToken.None); //exchange token requires userId
那么我是否应该在收到授权令牌之前注册用户?但是在我得到他的 Google 个人资料信息之前我不能这样做(为此我需要一个令牌)。
不幸的是,没有 .NET 客户端的文档,但是 documentation for other languages(在页面上搜索 "After the web server receives the authorization code" 以转到相关部分)没有提到 userId。
所以要么是我尝试使用了错误的方法,要么是 .NET Api 是错误的,或者我只是错过了一些明显的东西。
要通过access_token兑换授权码,您需要from the docs
- code - 从初始请求返回的授权码。
- client_id - 从 API 控制台获取的客户端 ID。
- client_secret - 从 API 控制台获取的客户端密码。
- redirect_uri - API 控制台中为此项目列出的重定向 URI 之一。
- grant_type - 根据 OAuth 2.0 规范中的定义,此字段必须包含值 authorization_code.
也许你说 expect userId
是 client_id
...我不知道图书馆...如果说期望 userId 而不是client_id 在这个 ExchangeCodeForTokenAsync
方法中。
让我们从获取用户的个人资料信息开始。
有两个 API 可以用于此人 API 和 google+ API。
以下方法将请求用户访问。每个用户都可以通过发送不同的用户名来更改,然后凭据信息将存储在 %appData% 中,您可以阅读更多相关信息 here
/// <summary>
/// This method requests Authentcation from a user using Oauth2.
/// Credentials are stored in System.Environment.SpecialFolder.Personal
/// Documentation https://developers.google.com/accounts/docs/OAuth2
/// </summary>
/// <param name="clientSecretJson">Path to the client secret json file from Google Developers console.</param>
/// <param name="userName">Identifying string for the user who is being authentcated.</param>
/// <returns>DriveService used to make requests against the Drive API</returns>
public static PeopleService AuthenticateOauth(string clientSecretJson, string userName)
{
try
{
if (string.IsNullOrEmpty(userName))
throw new ArgumentNullException("userName");
if (string.IsNullOrEmpty(clientSecretJson))
throw new ArgumentNullException("clientSecretJson");
if (!File.Exists(clientSecretJson))
throw new Exception("clientSecretJson file does not exist.");
// These are the scopes of permissions you need. It is best to request only what you need and not all of them
string[] scopes = new string[] { PeopleService.Scope.UserPhonenumbersRead, //View your phone numbers
PeopleService.Scope.UserAddressesRead, //View your street addresses
PeopleService.Scope.UserBirthdayRead, //View your complete date of birth
PeopleService.Scope.ContactsReadonly, //View your contacts
PeopleService.Scope.UserEmailsRead, //View your email addresses
PeopleService.Scope.UserinfoProfile, //View your basic profile info
PeopleService.Scope.UserinfoEmail, //View your email address
PeopleService.Scope.PlusLogin, //Know your basic profile info and list of people in your circles.
PeopleService.Scope.Contacts}; //Manage your contacts
UserCredential credential;
using (var stream = new FileStream(clientSecretJson, FileMode.Open, FileAccess.Read))
{
string credPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
credPath = Path.Combine(credPath, ".credentials/", System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
// Requesting Authentication or loading previously stored authentication for userName
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets,
scopes,
userName,
CancellationToken.None,
new FileDataStore(credPath, true)).Result;
}
// Create Drive API service.
return new PeopleService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "People Oauth2 Authentication Sample"
});
}
catch (Exception ex)
{
Console.WriteLine("Create Oauth2 account PeopleService failed" + ex.Message);
throw new Exception("CreateServiceAccountPeopleFailed", ex);
}
}
这将 return 一个 PeopleService,然后您可以使用它向人们提出请求 api。喜欢向用户请求数据。
var me = service.People.Get("people/me").Execute();
您可以向其中添加 google 日历范围,您的用户凭据将适用于 google 人员服务和 google 日历服务。
我也有一些 google 日历 here 的示例代码。
更新javascript问题:
JavaScript 不包含刷新令牌,您将只有一个访问令牌。 FileDatastore 将无法理解这一点。您可能需要自己实现 idatastore。我要问你的问题是,当访问令牌过期时,你打算如何处理?你打算对你的 JavaScript 授权代码进行某种回调吗?
我查看了 AuthorizationCodeFlow source code,虽然 userId 未用于 Google Api 请求(正如预期的那样),但它用于将结果存储到 DataStore。所以如果只是消费api调用结果,可以不传userId,否则必须有
我收到了我的 authorization code
并想在服务器上将其兑换成 authorization token
。 .NET Google API 在流程 class 中有 ExchangeCodeForTokenAsync
方法。似乎是我需要的,但它需要 userId 作为其参数之一。
var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "...",
ClientSecret = "..."
},
Scopes = new[] { "some scopes" },
});
flow.ExchangeCodeForTokenAsync(userId, code, "redirect url", CancellationToken.None); //exchange token requires userId
那么我是否应该在收到授权令牌之前注册用户?但是在我得到他的 Google 个人资料信息之前我不能这样做(为此我需要一个令牌)。
不幸的是,没有 .NET 客户端的文档,但是 documentation for other languages(在页面上搜索 "After the web server receives the authorization code" 以转到相关部分)没有提到 userId。
所以要么是我尝试使用了错误的方法,要么是 .NET Api 是错误的,或者我只是错过了一些明显的东西。
要通过access_token兑换授权码,您需要from the docs
- code - 从初始请求返回的授权码。
- client_id - 从 API 控制台获取的客户端 ID。
- client_secret - 从 API 控制台获取的客户端密码。
- redirect_uri - API 控制台中为此项目列出的重定向 URI 之一。
- grant_type - 根据 OAuth 2.0 规范中的定义,此字段必须包含值 authorization_code.
也许你说 expect userId
是 client_id
...我不知道图书馆...如果说期望 userId 而不是client_id 在这个 ExchangeCodeForTokenAsync
方法中。
让我们从获取用户的个人资料信息开始。
有两个 API 可以用于此人 API 和 google+ API。
以下方法将请求用户访问。每个用户都可以通过发送不同的用户名来更改,然后凭据信息将存储在 %appData% 中,您可以阅读更多相关信息 here
/// <summary>
/// This method requests Authentcation from a user using Oauth2.
/// Credentials are stored in System.Environment.SpecialFolder.Personal
/// Documentation https://developers.google.com/accounts/docs/OAuth2
/// </summary>
/// <param name="clientSecretJson">Path to the client secret json file from Google Developers console.</param>
/// <param name="userName">Identifying string for the user who is being authentcated.</param>
/// <returns>DriveService used to make requests against the Drive API</returns>
public static PeopleService AuthenticateOauth(string clientSecretJson, string userName)
{
try
{
if (string.IsNullOrEmpty(userName))
throw new ArgumentNullException("userName");
if (string.IsNullOrEmpty(clientSecretJson))
throw new ArgumentNullException("clientSecretJson");
if (!File.Exists(clientSecretJson))
throw new Exception("clientSecretJson file does not exist.");
// These are the scopes of permissions you need. It is best to request only what you need and not all of them
string[] scopes = new string[] { PeopleService.Scope.UserPhonenumbersRead, //View your phone numbers
PeopleService.Scope.UserAddressesRead, //View your street addresses
PeopleService.Scope.UserBirthdayRead, //View your complete date of birth
PeopleService.Scope.ContactsReadonly, //View your contacts
PeopleService.Scope.UserEmailsRead, //View your email addresses
PeopleService.Scope.UserinfoProfile, //View your basic profile info
PeopleService.Scope.UserinfoEmail, //View your email address
PeopleService.Scope.PlusLogin, //Know your basic profile info and list of people in your circles.
PeopleService.Scope.Contacts}; //Manage your contacts
UserCredential credential;
using (var stream = new FileStream(clientSecretJson, FileMode.Open, FileAccess.Read))
{
string credPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
credPath = Path.Combine(credPath, ".credentials/", System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
// Requesting Authentication or loading previously stored authentication for userName
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets,
scopes,
userName,
CancellationToken.None,
new FileDataStore(credPath, true)).Result;
}
// Create Drive API service.
return new PeopleService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "People Oauth2 Authentication Sample"
});
}
catch (Exception ex)
{
Console.WriteLine("Create Oauth2 account PeopleService failed" + ex.Message);
throw new Exception("CreateServiceAccountPeopleFailed", ex);
}
}
这将 return 一个 PeopleService,然后您可以使用它向人们提出请求 api。喜欢向用户请求数据。
var me = service.People.Get("people/me").Execute();
您可以向其中添加 google 日历范围,您的用户凭据将适用于 google 人员服务和 google 日历服务。
我也有一些 google 日历 here 的示例代码。
更新javascript问题:
JavaScript 不包含刷新令牌,您将只有一个访问令牌。 FileDatastore 将无法理解这一点。您可能需要自己实现 idatastore。我要问你的问题是,当访问令牌过期时,你打算如何处理?你打算对你的 JavaScript 授权代码进行某种回调吗?
我查看了 AuthorizationCodeFlow source code,虽然 userId 未用于 Google Api 请求(正如预期的那样),但它用于将结果存储到 DataStore。所以如果只是消费api调用结果,可以不传userId,否则必须有