[英]Google API authentification Server-Side
我正在嘗試使用 Gmail API 閱讀電子郵件,但是我遇到了一個問題,即我想要進行服務器端身份驗證,但是對於谷歌文檔中的所有示例,他總是向我顯示窗口,要求我添加我的憑據(Gmail 和密碼)。
public static async void CreateService()
{
GoogleCredential credential;
using (var stream = new FileStream(@"key.json", FileMode.Open,
FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream)
.CreateScoped(GmailService.Scope.GmailLabels,
GmailService.Scope.GmailModify, GmailService.Scope.GmailMetadata,
GmailService.Scope.GmailReadonly);
}
var service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Gmail",
});
Console.WriteLine(ListMessages(service, "me", ""));
}
然后我從如何讀取用戶消息的 google api 文檔中獲得了這段代碼。
public static List<Message> ListMessages(GmailService service, String userId, String query)
{
List<Message> result = new List<Message>();
UsersResource.MessagesResource.ListRequest request = service.Users.Messages.List(userId);
request.Q = query;
do
{
try
{
ListMessagesResponse response = request.Execute();
result.AddRange(response.Messages);
request.PageToken = response.NextPageToken;
}
catch (Exception e)
{
Console.WriteLine("An error occurred: " + e.Message);
}
} while (!String.IsNullOrEmpty(request.PageToken));
return result;
}
但是當我運行它時,我收到此錯誤:發生錯誤:
Google.Apis.Requests.RequestError
Bad Request [400]
Errors [
Message[Bad Request] Location[ - ] Reason[failedPrecondition] Domain[global]
]
如果要使用用戶作為身份驗證帳戶,則不需要。 這是不可能的,您總是會彈出登錄窗口。
但是,您可以創建和使用服務帳戶來模擬您的用戶並繞過在運行時進行身份驗證的需要。 它們需要一些額外的設置,但您可以在Google Developer Admin Console 中創建它們。
創建您的服務帳戶並為其提供所需的角色和權限(請參閱下面的鏈接)后,您只需對代碼進行小幅編輯即可使用它而不是您的常規帳戶。 這是 Python 中的示例,但您可以在管理密鑰頁面上找到其他示例:
import os
from google.oauth2 import service_account
import googleapiclient.discovery
def create_key(service_account_email):
"""Creates a key for a service account."""
credentials = service_account.Credentials.from_service_account_file(
filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
scopes=['YOUR SCOPES HERE'])
# Rememer here that your credentials will need to be downloaded
# for the service account, YOU CAN NOT USE YOUR ACCOUNT'S CREDENTIALS!
service = googleapiclient.discovery.build(
'service', 'version', credentials=credentials)
key = service.projects().serviceAccounts().keys().create(
name='projects/-/serviceAccounts/' + service_account_email, body={}
).execute()
print('Created key: ' + key['name'])
我希望這對你有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.