我正在尝试使用Mailkit从我的Gmail中接收电子邮件:
private readonly string[] Scopes = { GmailService.Scope.GmailReadonly };
private UserCredential GetGmailCredential()
{
UserCredential credential;
using (var stream = new FileStream("client_id.json", FileMode.Open, FileAccess.Read))
{
// The file token.json stores the user's access and refresh tokens, and is created
// automatically when the authorization flow completes for the first time.
string credPath = "token.json";
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
"user",
CancellationToken.None,
new FileDataStore(credPath, true),
new LocalServerCodeReceiver()).Result;
Console.WriteLine($"Credential file saved to: {credPath}");
}
return credential;
}
[HttpGet("check")]
public string GetD()
{
using (var client = new ImapClient())
{
client.Connect("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect);
UserCredential credential = GetGmailCredential();
//var oauth2 = new SaslMechanismOAuth2("myaccount008@gmail.com", credential.Token.AccessToken);
var oauth2 = new SaslMechanismOAuth2("myaccount008",credential.Token.AccessToken);
client.Authenticate(oauth2);
client.Inbox.Open(FolderAccess.ReadOnly);
var uids = client.Inbox.Search(SearchQuery.FromContains("bill"));
string subjects = string.Empty;
foreach (var uid in uids)
{
var message = client.Inbox.GetMessage(uid);
subjects += message.Subject + Environment.NewLine;
// write the message to a file
message.WriteTo(string.Format("{0}.eml", uid));
}
client.Disconnect(true);
return subjects;
}
}
行:客户端。身份验证(oauth 2);引发异常-
MailKit.Security.AuthenticationException
我按照这个答案设置了我的Gmail API,但是后来我遇到了认证失败的问题。
这是日志:
Connected to imaps://imap.gmail.com:993/ S: * OK Gimap ready for requests from 122.199.45.135 d3mb920463124pjs C: A00000000 CAPABILITY S: * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH S: A00000000 OK Thats all she wrote! d3mb920463124pjs C: A00000001 AUTHENTICATE XOAUTH2 dXNlcj1mcmFudmEwMDhAZ21haWwuY29tAWF1dGg9QmVhcmVyIHlhMjkuYTBBZHcxeGVWZDNSWWwzcVZlblZwVm1MbDBRRVVyWkdxd05veEd0QWpcLVhHNjRBaF90eWM0NWhwSFprZHA0d3dPWlpGMVZwbGM3dGo1Tm80eVMwc2lPNE1VYmhHV1I1WE9sdWtLUGY4TF9QU0dpZjhrSWM2UXNUbTQwYjlweDNBeXE4bVYtOTM2akEtSHdXekNQVFdGMGk0NGozX2FOTmhEYk5rAQE= S: + eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoPQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ== C: S: A00000001 NO [AUTHENTICATIONFAILED] Invalid credentials (Failure)
范围,我使用:GmailService.Scope.Gmail只读,因为我只需要检索电子邮件。
将我的范围更新为:
private readonly string[] Scopes = { GmailService.Scope.MailGoogleCom };
Connected to imaps://imap.gmail.com:993/ S: * OK Gimap ready for requests from 122.199.45.135 s90mb321411106pjc C: A00000000 CAPABILITY. S: * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH S: A00000000 OK Thats all she wrote! s90mb321411106pjc C: A00000001 AUTHENTICATE XOAUTH2 dXNlcj1mcmFudmEwMDhAZ21haWwuY29tAWF1dGg9QmVhcmVyIHlhMjkuYTBBZHcxeGVWZDNSWWwzcVZlblZwVm1MbDBRRVVyWkdxd05veEd0QWpXLVhHNjRBaF90eWM0NWhwSFprZHA0d3dPWlpGMVZwbGM3dGo1Tm80eVMwc2lPNE1VYmhHV1I1WE9sdWtLUGY4TF9QU0dpZjhrSWM2UXNUbTQwYjlweDNBeXE4bVYtOTM2akEtSHdXekNQVFdGMGk0NGozX2FPTmhEYk5rAQE= S: + eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiSmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ== C: S: A00000001 NO [AUTHENTICATIONFAILED] Invalid credentials (Failure)
我保持一切不变,并尝试使用GmailService.Scope。ReadOnly随后用以下代码替换了ImapClient,现在它可以工作了。
// Create Gmail API service.
service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = ApplicationName,
});
这段代码来自Gmail Api。如果我能使用Mailkit进行身份验证,那就太好了。
部分问题在于您使用了错误的作用域。您需要使用GoogleService.Scope.MailGoogleCom。
您使用的范围不适用于IMAP或POP3访问,它仅适用于Google的网络请求API。
以下代码适用于我:
const string GMailAccount = "username@gmail.com";
var clientSecrets = new ClientSecrets {
ClientId = "XXX.apps.googleusercontent.com",
ClientSecret = "XXX"
};
var codeFlow = new GoogleAuthorizationCodeFlow (new GoogleAuthorizationCodeFlow.Initializer {
DataStore = new FileDataStore ("CredentialCacheFolder", false),
Scopes = new [] { "https://mail.google.com/" },
ClientSecrets = clientSecrets
});
var codeReceiver = new LocalServerCodeReceiver ();
var authCode = new AuthorizationCodeInstalledApp (codeFlow, codeReceiver);
var credential = await authCode.AuthorizeAsync (GMailAccount, CancellationToken.None);
if (authCode.ShouldRequestAuthorizationCode (credential.Token))
await credential.RefreshTokenAsync (CancellationToken.None);
var oauth2 = new SaslMechanismOAuth2 (credential.UserId, credential.Token.AccessToken);
using (var client = new ImapClient ()) {
await client.ConnectAsync ("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect);
await client.AuthenticateAsync (oauth2);
await client.DisconnectAsync (true);
}
我尝试在Azure门户上创建的O365应用程序上进行身份验证,但它没有按预期工作。 以下代码运行良好,但它使用的是登录/密码,Microsoft不推荐使用。(在此处找到https://github.com/jstedfast/MailKit/issues/989) 事实上,我希望能够使用tenanid、客户端机密和clientid进行身份验证,但没有交互模式(因为该应用程序是Windows服务)。
问题内容: 我的项目使用Node.js和Express,但问题在于通用方法。 我们的用户全部来自FB,除FB外,我们没有其他任何身份验证。我们需要将某些操作与特定的FB用户相关联,还需要他们的令牌才能与FB通信。 目前, 我们这样做: 用户来到页面 有一些 看不见的 块:一个带有占位符,用于存储用户的化身和姓名(“已登录”),另一个带有用于触发FB登录的按钮(“已退出”) 使用FB JS SDK,
问题内容: 在我的iOS应用程序中,我想使用WKWebView在应用程序中包装外部URL 。此URL需要基本身份验证(它需要用户和密码凭据,如以下屏幕截图所示)。 经过一番调查,我尝试使用 didReceiveAuthenticationChallengemethod来启用自动 登录,因此我不了解它的工作原理。 这是我的代码。 I’m facing with this exception: If
我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢
jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。