如何使用 OAuth 或 OAuth2 身份验证通过 IMAP 访问 Yahoo Mail

Posted

技术标签:

【中文标题】如何使用 OAuth 或 OAuth2 身份验证通过 IMAP 访问 Yahoo Mail【英文标题】:How can Yahoo Mail be accessed by IMAP using OAuth or OAuth2 authentication 【发布时间】:2016-07-03 16:22:11 【问题描述】:

根据 developer.yahoo.com/mail/ 和 IMAP 回复:

* OK [CAPABILITY IMAP4rev1 ID MOVE NAMESPACE X-ID-ACLID UIDPLUS LITERAL+ CHILDREN XAPPLEPUSHSERVICE XYMHIGHESTMODSEQ AUTH=PLAIN AUTH=LOGIN AUTH=XOAUTH2 AUTH=XYMCOOKIE AUTH=XYMECOOKIE AUTH=XYMCOOKIEB64 AUTH=XYMPKI] IMAP4rev1 imapgate-1.8.1_01.20166 imap1009.mail.ne1.yahoo.com

Yahoo Mail 可以通过 IMAP 使用 OAuth(2) 身份验证访问。

我在https://developer.yahoo.com/apps/ 上注册了我的应用程序,因此我获得了客户端 ID 和客户端密码。我没有找到任何与邮件相关的范围(API 权限)。尽管如此,我还是选择了注册应用程序时显示的所有 API 权限。

我尝试同时实现 OAuth 和 OAuth2。

OAuth2: 我无法获得范围“mail-r”的授权码。当我生成 URL(https://api.login.yahoo.com/oauth2/request_auth?client_id=CLIENT_ID&redirect_uri=oob&scope=mail-r&response_type=code) 并在浏览器中打开它时,页面显示“开发人员:请从注册的范围请求范围并再次提交”。被展示。它适用于其他范围。例如,我可以获得“sdct-r”的授权码

OAuth: 我能够获得访问令牌。但是当我使用 AUTHENTICATE XOAUTH2 命令发送它时,我收到“NO [AUTHENTICATIONFAILED] (#AUTH007) Bad scope”响应。

那么问题是应该设置什么范围来使用 IMAP 和 OAuth(2) 访问 Yahoo Mail?

【问题讨论】:

似乎邮件 api 可用于高级邮件帐户...查看 packagetracker 网站,在注册 yahoo 时,它显示了 oauth2 过程中的邮件范围...我找不到包含该范围的方法...如果您找到了包含它的方法,请在此处发布答案,这将是一个很大的帮助... @Aleksey 你在这上面找到什么了吗? @Aleksey,请将 user3377687 答案标记为已接受...我已经检查过了,它可以工作...如果您将范围设置为 ymrf => 完全访问权限,它肯定会添加邮件完全权限 完成,谢谢。当然,非常感谢@user3377687。 【参考方案1】:

2017 年 2 月 27 日更新:此变通办法将不再有效,因为雅虎不幸删除了下面引用的 cck-form.html 页面,并且似乎不允许新应用请求邮件相关的 API 访问。希望这会有所改变。

您可以通过以下方式在 yahoo 上创建一个可以完全访问电子邮件的应用程序。 (最近雅虎从他们的 UI 中删除了这个选项)一旦获得适当的权限,获取 oauth 令牌和访问邮箱应该是直截了当的,我不在这里介绍它。

    访问 https://developer.yahoo.com/oauth/guide/cck-form.html 并查找“这是一个示例表单以及您可以在表单中使用的示例值”并将示例 html 复制到本地文件并保存。下面提供了 html 的副本。

    在浏览器中打开文件。填写适当的信息(设置 scope=ymrf 以获得完整的邮件访问权限)并点击“带有调试的弹出窗口”。

    在弹出窗口中单击允许。如果您尚未在浏览器上登录 yahoo,则需要登录。

转到https://developer.yahoo.com/apps/,您应该会看到您的应用具有适当的权限。

<html>  
<head>  
    <title>CCK Example</title>  
</head>  
<body>  
  
<form target="yCredWindow" action="http://developer.apps.yahoo.com/projects/createconsumerkey" method="post" id="extAuthForm" name="extAuthForm">  
  
<h2>Inputs</h2>  
<p>* = Required</p>    
<table>  
    <tr><th>Field</th>  
        <th>Input</th></tr>  
  
    <tr><td>* Application Name: </td>  
        <td><input name="name" id="name" value="Janrain Engage"></td></tr>  
  
    <tr><td>Description: </td>  
        <td><input name="description" id="desc"></td></tr>  
  
    <tr><td>appid: </td>  
        <td><input name="appid" id="appid"></td></tr>  
  
    <tr><td>Return to: </td>  
        <td><input name="return_to" id="return_to"></td></tr>  
  
    <tr><td>* Third Party Name: </td>  
        <td><input name="third_party" id="third_party" value="Janrain"></td></tr>  
  
    <tr><td>* Scopes: </td>  
        <td><input name="scopes" id="scope" value="ysrw"></td></tr>  
  
    <tr><td>Favicon URL: </td>  
        <td><input name="favicon" id="favicon"></td></tr>  
  
    <tr><td>Application URL: </td>  
        <td><input name="application_url" id="application_url"></td></tr>  
  
    <tr><td>* Domain: </td>  
        <td><input name="domain" id="domain" value="www.janrain.com"></td></tr></table>  
  
<input type="hidden" name="debug" id="debug" value="true">  
  
<button type="reset">clear all fields</button>  
<button type="button" id="submitWithDebug">pop window with debug</button>  
</form>  
  
<h6>Note: A URL that starts with http:// is required for: Return to, Favicon URL and Application URL.  However, you will get an error if you include http:// for the Domain.</h6>  
  
<h2>Returns</h2>  
<table>  
    <tr><td>Key returned:</td>  
        <td><input type="text" id="cKeyInputField"></td></tr>  
  
    <tr><td>Secret returned:</td>  
        <td><input type="text" id="cSecretInputField"></td></tr>  
  
    <tr><td>Appid returned:</td>  
        <td><input type="text" id="returnAppid"></td></tr></table>  
  
<script src="http://yui.yahooapis.com/3.0.0/build/yui/yui-min.js"></script>  
<script>  
  
var formTarget = null;  
  
// used by return_to.html to set the fields with the data that comes back  
var setFields = function(id, val)   document.getElementById(id).value = val; ;  
  
// pops the window, then submits to it  
var popWindowOnSubmit = function(e)    
    window.open('', formTarget, 'status=0,toolbar=0,location=0,menubar=0,width=545,height=650');  
    document.extAuthForm.submit();  
;  
  
// handle submit when the button is clicked  
YUI().use('node', function(Y)   
    formObject = Y.one('#extAuthForm');  
    formTarget = formObject.getAttribute('target');  
    Y.on('click', popWindowOnSubmit, '#submitWithDebug');  
);  
  
</script>  
  
</body>  
</html> 

【讨论】:

这家伙值得一个饼干 该解决方案有效,但可以解决雅虎已从其 UI 中删除的内容。有谁知道他们为什么删除它?另外,只读的范围是什么? @user3377687 ,你是救生员。这奇迹般地为 Yahoo APP 添加了权限……现在剩下的唯一一件事就是获取有关如何访问邮件及其标题的 yahoo 文档……似乎他们没有将其包含在 Mail Docs @user3377687 ,尽管我必须在完成后使用 OAuth2 流程为 yahoo 检查它......然后我们将再次确定这是一种工作方法......因为这会提交应用程序根据 oauth 指南请求...如果这不适用于 OAuth2 请求,我们可能需要使用 oauth 方法来使用此服务 此解决方法现在不起作用。在调试模式下打开弹出窗口时,尝试打开 developer.yahoo.com/projects/createconsumerkey 并失败,状态为 404。还有其他解决方法吗?【参考方案2】:

截至 2017 年 8 月,获取电子邮件地址的唯一方法是使用名为Profiles - Read/Write Public and Private的范围。雅虎对误导性选项的一个非常愚蠢的选择,因为我们根本不想“写”任何东西。

作为额外的头痛,这还将返回与该帐户关联的所有电子邮件列表,而不仅仅是主要电子邮件。并且无法准确识别哪个是真实的 - 列表中返回的 primary=true 字段不可信。

【讨论】:

【参考方案3】:

当您在https://developer.yahoo.com/apps/ 上创建/配置应用程序时,您必须添加“Mail Read-Only”范围。

不幸的是,当我尝试在新创建的应用上执行此操作时,该选项不可用。

您可能需要与 Yahoo 取得联系才能让他们允许您请求这些范围。

【讨论】:

【参考方案4】:

您必须在访问授权端点时添加 scope=openid, 然后在hittng令牌端点后获得令牌后, 使用获得的访问令牌命中配置文件端点, 然后我们在配置文件 json 对象下收到电子邮件

【讨论】:

【参考方案5】:

为了让您在潜在范围列表中看到邮件复选框,雅虎必须将您的开发者帐户列入白名单。我找不到任何关于此的文档或有关如何索取它的说明,因此我无法使用任何文档来支持它。

【讨论】:

【参考方案6】:

我找到了另一种方法来创建启用邮件 API 权限的应用程序。我注意到如果您在 URL 中包含“api”参数,您可以指定要包含的范围,无论它们是否在底部被选中。我注意到如果您在 URL 中提供了“api=mail”,它默认包含邮件权限。因此,要创建具有邮件权限的新应用,请使用以下 URL:

https://developer.yahoo.com/apps/create/?api=mail

【讨论】:

这会创建客户端 ID 和密钥,但在尝试获取请求令牌时会收到“oauth_problem=consumer_key_rejected”。 @ewein - 您是否解决了评论 oauth_problem=consumer_key_rejected 中提到的问题?

以上是关于如何使用 OAuth 或 OAuth2 身份验证通过 IMAP 访问 Yahoo Mail的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OAuth2 身份验证保护私有数据?

如何使用 Angular 2 进行 oAuth2 基本身份验证?

如何使用 OAuth2 身份验证设置 traefik

如何使用 oauth2 通过 REST Web 服务进行身份验证

如何使用 Twisted 通过 OAuth2.0 身份验证检查 Gmail

如何使用 oAuth2 对 SPA 用户进行身份验证?