Gmail,OutLook邮箱基于Oauth2.0协议授权登录邮箱客户端

1. 邮箱登录安全

考虑到邮箱登陆的安全性,使用这种登陆方法,用户不用暴露帐号密码给我们客户端就可以进行收发邮件,google推荐用户使用网页授权登陆的方式来登陆Gmail邮箱。
查阅相关资料后,得知,这种授权登陆的方式都是给予Oauth2.0协议。很多第三方的邮件客户端都已实现了给予Oauth2.0授权登陆这一功能,例如:

WPS邮箱,QQ邮箱,网易邮箱大师实现了gmail的授权登陆
WeMail,myMail等客户端实现了gmail和outlook的授权登陆
微软的Outlook客户端实现了gmail,outlook,yahoo,office365的授权登陆
ios邮件实现了gmail,yahoo的授权登陆


2. Oauth2.0协议流程

经研究,终于弄清楚了登陆的流程。整个流程就是基于Oauth2.0协议和Imap协议的。Oauth2.0授权登陆流程具体如下:

Oauth2.0授权模式有多种,这里使用简化模式登陆最方便。
简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

它的步骤如下:
(A)客户端将用户导向认证服务器。
(B)用户决定是否给于客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。
(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
(F)浏览器执行上一步获得的脚本,提取出令牌。
(G)浏览器将令牌发给客户端。

下面是上面这些步骤所需要的参数。
A步骤中,客户端发出的HTTP请求,包含以下参数:

response_type:表示授权类型,此处的值固定为"token",必选项。
client_id:表示客户端的ID,必选项。
redirect_uri:表示重定向的URI,可选项。
scope:表示权限范围,可选项。
state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。

C步骤中,认证服务器回应客户端的URI,包含以下参数:

access_token:表示访问令牌,必选项。
token_type:表示令牌类型,该值大小写不敏感,必选项。
expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
state:如果客户端的请求中包含这个参数,认证服务器的回应也必须,一模一样包含这个参数。

如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌。
客户端发出更新令牌的HTTP请求,包含以下参数:

granttype:表示使用的授权模式,此处的值固定为"refreshtoken",必选项。
refresh_token:表示早前收到的更新令牌,必选项。
scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数则表示与上一次一致。

3. 使用Oauth2.0协议登陆Outlook的实现 概述

基于这个流程,我们先尝试实现Outlook.com的授权登陆。
在此之前,查阅了大量microsoft提供给开发者的帮助文档:
1.用C#和VB实现的例子 OAuth 2.0 for Microsoft Accounts (installed applications):
http://www.afterlogic.com/mailbee-net/docs/OAuth2MicrosoftRegularAccountsInstalledApps.html#RegisterMicrosoft
2.Windows Live Connect实现oauth2.0协议流程:
https://msdn.microsoft.com/en-us/library/hh243647.aspx#
3.Oauth2.0 scope参数详解
https://msdn.microsoft.com/en-us/library/hh243646.aspx#accessing
4.Live SDK developer guide:
https://msdn.microsoft.com/en-us/library/hh243641.aspx
5.获取用户info文档
https://msdn.microsoft.com/en-us/library/hh826533.aspx
6.Connect to Outlook.com IMAP using OAuth 2.0
https://msdn.microsoft.com/en-us/library/dn440163.aspx

通过对这写文档的仔细阅读,可以得知,microsoft账户授权登陆的参数如下:
          auth_endpoint="https://login.live.com/oauth20_authorize.srf"
          token_endpoint="https://login.live.com/oauth20_token.srf"
          refresh_endpoint="https://login.live.com/oauth20_token.srf"
          response_type="code"
          redirect_uri="https://login.live.com/oauth20_desktop.srf"
          scope="wl.basic wl.offline_access wl.emails wl.imap"
          state="state"
          client_id="000000004C187996"
          client_secret="YzfVeh1WllDzBuC7-t9lrhPM5AGrqXfX"

其中的client_id和client_secret需要先创建一个微软账户,然后登陆微软的Live.com Developer Center: https://account.live.com/developers/applications/

建立一个 applications,就可以取到合法的client_id和client_secret。

通过上面的参数使用Http Post,向服务器请求,就可以得到:
{"token_type":"bearer",
"expires_in":3600,
"scope":"wl.basic wl.offline_access wl.emails wl.imap wl.signin",

"access_token":"EwCIAq1DBAAUGCCXc8wU/zFu9QnLdZXy+YnElFkAAednF24XQXBC+PBhDpfx2c7Z5/XKYAbNlItHSvK/CAuEhAew1YXyMGKUGHoe3g+mqEHQJO+eQqt/RFNnr7XY0362G/2FoSbClPl1s4YPs+oBF8vPlWlKl+5ORydw6i7AmzyxSO7Dz/IXlbtRoHYERgZayEYyJBNRd+7thcKivCtyHrpQI25Ue/jY+KIJEVMRzj35Ujjc3IbbSXkG8AEztyKmI/vDMHU2rRqYffmbZG3w7eGP1a4kB",

"refresh_token":"MCdn2!RmPgwz9FbjIlFiqygD4uEMdCoFPEWpxoT4GB6gILh9VzgF8hM2FMNyjrnHsjGR0LlH0LaS0BT4LowsI7Q$",
"user_id":"d9f34c758d648aac466bf1f40766ad7a"}

里面包含我们需要的授权令牌access_token,和刷新令牌refresh_token。

但是,里面却没有包含用户的邮箱地址以及用户名,而邮箱地址是客户端一定需要的一个参数。
通过阅读文档: https://msdn.microsoft.com/en-us/library/hh826533.aspx

可以通过HTTP GET https://apis.live.net/v5.0/me?access_token=ACCESS_TOKEN
向服务器请求用户的信息。


最后,也是最终要的步骤,就是如何通过授权令牌access_token来进行收发邮件,收邮件是用Imap协议,发送用Smpt协议
microsoft对此也有帮助文档: https://msdn.microsoft.com/en-us/library/dn440163.aspx


上图就是封装access_token的方法,
具体的代码实现为:
final String accessToken = AuthenticationCache.getInstance().retrieveAccessToken(
        mImapStore.getContext(), mImapStore.getAccount());
if (mLoginPhrase == null || !TextUtils.equals(mAccessToken, accessToken)) {
    mAccessToken = accessToken;
    final String oauthCode = "user=" + mImapStore.getUsername() + '\001' +
            "auth=Bearer " + mAccessToken + '\001' + '\001';
    mLoginPhrase = ImapConstants.AUTHENTICATE + " " + ImapConstants.XOAUTH2 + " " +
            Base64.encodeToString(oauthCode.getBytes(), Base64.NO_WRAP);
}
上面就是使用Oauth2.0实现登陆Outlook基本流程,具体的实现细节要比这要复杂很多,就不在此赘述了。
在PHP中使用IMAP功能操作Outlook邮箱(需要OAuth 2.0认证)一般涉及到两个步骤:首先,你需要通过OAuth 2.0获取访问令牌;其次,使用这个令牌来连接到IMAP服务器。以下是基本流程: 1. **授权过程**: - 注册一个应用程序并在Office 365开发者门户(https://apps.dev.microsoft.com/)创建一个应用,申请"Exchange Online IMAP Protocol"和"Mail.Read"等必要的API权限。 - 获取客户端ID(Client ID)、客户端秘密(Client Secret)以及授权重定向URI。 2. **获取Access Token**: - 使用`Authorization Code Flow`,用户登录后会跳转到你的应用重定向URI,并带着授权码。然后,使用`curl`或类似库发送POST请求到Microsoft Graph的授权端点,包括授权码、client ID、client secret和授权范围(例如:`https://graph.microsoft.com/v1.0/oauth2/v2.0/token`)。 - 示例代码(注意这只是一个基本示例,实际编码时需要处理错误和加密敏感信息): ```php $url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'; $data = [ 'grant_type' => 'authorization_code', 'code' => $_GET['code'], 'redirect_uri' => 'your_redirect_url', 'client_id' => 'your_client_id', 'client_secret' => 'your_client_secret', 'scope' => 'https://graph.microsoft.com/.default' ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); $response = json_decode(curl_exec($ch), true); curl_close($ch); $access_token = $response['access_token']; ``` 3. **使用IMAP连接**: - 接着,使用`imap_open`函数并传入邮件服务器地址和使用的OAuth凭据(通常是一个包含`AUTH=Bearer`头的HTTP Basic Auth形式,而不是用户名和密码)来连接邮箱。 ```php $options = array( 'host' => '{outlook.office365.com:993/imap/ssl}', 'auth' => 'login', 'username' => 'user@domain.com', // 用户的Outlook email地址 'password' => $access_token, 'port' => 993, 'encoding' => 'UTF-8' ); $inbox = imap_open('{imap.gmail.com:993/imap/ssl}INBOX', '', $access_token, OP_READONLY); // 现在你可以对邮箱进行读取操作... ``` 记得定期刷新Access Token,因为它们有有效期,超出期限就需要重新获取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值