精易论坛

标题: 记一次自己研究一天的微软Oauth协议获取Token并发送邮件 [打印本页]

作者: 小房同学    时间: 2025-1-19 15:29
标题: 记一次自己研究一天的微软Oauth协议获取Token并发送邮件
本帖最后由 小房同学 于 2025-1-19 15:28 编辑

前言:



自从微软更新了之后,直接使用账号密码验证的方式失效了,现在要用Oauth2.0验证,研究了一天,前面在论坛上搜了相关的帖子,发现有的 易友 发了相关的模块,也有的发了成品的软件,想下载研究一下,发现链接失效了。请问,你发帖的意义是何在?引流贴?这些都解决不了我刨根问底的心理,其实真的没有那么难!发这个贴子也是跟大家交流技术 禁止使用一切违法违规的行为哦~~~




一:注册微软账号


注册地址:https://portal.azure.com/#home


注册完账号之后,创建一个应用,它可能会提示目录下没有权限这类的提示,不用担心,用注册微软邮箱的账号 申请开通365开发人员权限,开通后再回来进行创建应用。



二:这是我创建的应用信息






这里要注意 
1.创建应用的时候,权限不要选择 仅Microsoft个人账号权限,我个人测试的是拿不到Token,大家也可以自行测试。
2.重定向URL不要填写带有https的网址,会有不安全提示,最好是填写http://localhost:端口号/



三:建立获取令牌请求链接






https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=客户DuanID&scope=https://outlook.office.com/SMTP.Send%20offline_access%20email%20openid&redirect_uri=重定向URL&response_type=code&prompt=login

这里我用互联网浏览器支持库2.0进行浏览的这个页面 登陆授权后 会像重定向的URL 发送一个code的参数。
具体是 http:127.0.0.1/?code=auth_code  这里的auth_code 就是授权拿到的令牌,我用E2EE支持库进行了接收。



这个是我的易语言代码:




四:建立链接拿Access_token



POST请求

url:https://login.microsoftonline.com/common/oauth2/v2.0/token

提交参数:“code=” + 授权拿到的令牌 + “&client_id=客户Duan的ID&redirect_uri=重定向URL/&grant_type=authorization_code&client_secret=客户Duan的密码”

这里要注意:客户Duan的密码不要泄露,可以写一个php的接口进行调用

在使用微软 OAuth2 等认证机制时,client_secret是非常重要的安全凭证,如果client_secret暴露了,可能会导致以下严重后果:
身份验证和授权方面
令牌被盗用:client_secret与client_id一起用于获取访问令牌。攻击者获取client_secret后,就可以冒充合法客户Duan向认证服务器请求令牌。一旦获取到令牌,攻击者就能以合法用户或应用的身份访问受保护的资源,例如访问用户的邮件、文件、企业数据等,可能导致数据泄露、数据被篡改或删除等严重问题。
权限提升攻击:攻击者可能利用暴露的client_secret获取具有更高权限的令牌,进而访问原本受限的敏感资源或执行敏感操作。比如在企业应用中,可能获取管理员权限,从而对整个企业的系统和数据造成巨大破坏。
应用安全和数据安全方面
应用被恶意利用:攻击者可以使用暴露的client_secret将恶意应用与目标系统进行集成,伪装成合法应用来收集用户数据、执行恶意代码或进行其他有害操作。这可能会损害应用的声誉,导致用户对应用失去信任,进而影响业务的正常开展。
数据泄露风险加剧:攻击者能够通过合法的认证途径访问应用后端数据库或其他数据存储,获取大量用户数据,包括个人信息、财务数据、业务机密等。这些数据可能被用于商业间谍活动、身份盗窃、诈骗等违法犯罪行为,给用户和企业带来巨大的经济损失和隐私侵害。

这里百du找到的,哈哈哈



设置客户Duan密码图文教程






五:发送邮件




POST请求

url:https://outlook.office.com/api/v2.0/me/sendmail

提交参数:“{” + #引号 + “Message” + #引号 + “:{” + #引号 + “Subject” + #引号 + “:” + #引号 + Subject + #引号 + “,” + #引号 + “Body” + #引号 + “:{” + #引号 + “ContentType” + #引号 + “:” + #引号 + ContentType + #引号 + “,” + #引号 + “Content” + #引号 + “:” + #引号 + Content + #引号 + “},” + #引号 + “ToRecipients” + #引号 + “:[{” + #引号 + “EmailAddress” + #引号 + “:{” + #引号 + “Address” + #引号 + “:” + #引号 + Address + #引号 + “}}]}}”

协议头:“Authorization”, “Bearer ” + Access_Token  这里assesstoken是拿到的token
协议头:“Content-Type”, “application/json”
协议头:“User-Agent”, “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36”

这里我是用精易助手生成的,具体要不要带,带哪个,不用带哪个,我没有具体的测试。



发送邮件的易语言代码:
不知道为什么发送成功后返回空,失败就有提示:不纠结了~~~~




php发送邮件的代码




[PHP] 纯文本查看 复制代码
<?php
// 访问令牌
$accessToken = "";
// 收件人邮箱
$recipientEmail = "[email protected]";
// 邮件主题
$mailSubject = "Test Email";
// 邮件内容
$mailContent = "This is a test email sent using PHP and Microsoft OAuth2.";


// 构建邮件数据
$mailData = array(
    "Message" => array(
        "Subject" => $mailSubject,
        "Body" => array(
            "ContentType" => "Text",
            "Content" => $mailContent
        ),
        "ToRecipients" => array(
            array(
                "EmailAddress" => array(
                    "Address" => $recipientEmail
                )
            )
        )
    )
);


// 将邮件数据转换为 JSON 字符串
$jsonData = json_encode($mailData);

echo $jsonData;

// 发送邮件的 API 地址
$apiUrl = "https://outlook.office.com/api/v2.0/me/sendmail";


// 初始化 cURL 会话
$ch = curl_init();


// 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Authorization: Bearer ". $accessToken,
    "Content-Type: application/json",
    "Content-Length: ". strlen($jsonData)
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 暂时关闭 SSL 验证,仅用于测试
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);


// 执行 cURL 会话并获取响应
$response = curl_exec($ch);


// 检查是否有错误发生
if(curl_errno($ch)){
    echo 'Curl error: '. curl_error($ch);
}


// 获取 HTTP 状态码
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode >= 400) {
    echo "HTTP Error: ". $httpCode. " ". curl_error($ch);
}


// 记录响应内容
error_log("Response: ". $response);


// 关闭 cURL 会话
curl_close($ch);


// 输出响应
echo $response;
?>

作者: cs潇潇    时间: 2025-1-19 16:54
第一步注册应用就卡住了,要信用卡才行,还是试用,也不是长久之计啊
作者: 小房同学    时间: 2025-1-19 17:53
cs潇潇 发表于 2025-1-19 16:54
第一步注册应用就卡住了,要信用卡才行,还是试用,也不是长久之计啊

不需要 是你的姿势不对
作者: cs潇潇    时间: 2025-1-19 18:04
小房同学 发表于 2025-1-19 17:53
不需要 是你的姿势不对

能给个详细注册应用的方法吗,一直卡这过不去
作者: qixiaoqi88    时间: 2025-1-19 19:46
好厉害 顶
作者: 风一样存在    时间: 2025-2-2 09:40
好厉害 顶
作者: Myheart    时间: 2025-2-16 09:45
小房同学 发表于 2025-1-19 17:53
不需要 是你的姿势不对

方便说下正确姿势吗

作者: 小房同学    时间: 2025-2-16 13:50
Myheart 发表于 2025-2-16 09:45
方便说下正确姿势吗

注册完账号之后,创建一个应用,它可能会提示目录下没有权限这类的提示,不用担心,用注册微软邮箱的账号 申请开通365开发人员权限,开通后再回来进行创建应用。
作者: Myheart    时间: 2025-2-16 19:36
小房同学 发表于 2025-2-16 13:50
注册完账号之后,创建一个应用,它可能会提示目录下没有权限这类的提示,不用担心,用注册微软邮箱的账号 ...

感谢
作者: Myheart    时间: 2025-2-17 11:54
这个E2EE获取令牌的代码能发一下么,大佬
作者: 小房同学    时间: 2025-2-17 14:39
Myheart 发表于 2025-2-17 11:54
这个E2EE获取令牌的代码能发一下么,大佬

额  e2ee搭建一个服务器 接收code参数就可以了 ,  微软验证成功后会自动访问127.0.0.1:5200/code=
作者: Myheart    时间: 2025-2-17 15:19
小房同学 发表于 2025-2-17 14:39
额  e2ee搭建一个服务器 接收code参数就可以了 ,  微软验证成功后会自动访问127.0.0.1:5200/code= ...

但是这个获取到的Code无法获取Access_token,这步有例子吗
作者: Myheart    时间: 2025-2-17 15:42
小房同学 发表于 2025-2-17 14:39
额  e2ee搭建一个服务器 接收code参数就可以了 ,  微软验证成功后会自动访问127.0.0.1:5200/code= ...

用你发的软件添加微软邮箱验证也是失败,

QQ截图20250217154105.png (50.98 KB, 下载次数: 0)

QQ截图20250217154105.png

作者: mufan1633    时间: 2025-2-19 23:46
现在这个还好用吗
作者: 小房同学    时间: 2025-2-20 10:05
mufan1633 发表于 2025-2-19 23:46
现在这个还好用吗

没有这个 微软发不了邮件啊
作者: chenjiaxiang    时间: 2025-3-4 21:20
{"error":{"code":"InvalidMsaTicket","message":"ErrorCode: 'PP_E_RPS_REASON_TIMEWINDOW_EXPIRED'. Message: ''","innerError":{"oAuthEventOperationId":"473b389a-aff0-499c-8f2f-d360ef000b35","oAuthEventcV":"OCVIeZdwIlJrAemUOFDd2w.1.1","errorUrl":"https://aka.ms/autherrors#error-InvalidMsaTicket","requestId":"6ef4ed18-f4d8-4fcc-80c1-2715d9f6a416","date":"2025-03-04T13:17:32"}}}z这个是什么原因呀,大佬
作者: chenjiaxiang    时间: 2025-3-4 21:21
发件提示这个{"error":{"code":"InvalidMsaTicket","message":"ErrorCode: 'PP_E_RPS_REASON_TIMEWINDOW_EXPIRED'. Message: ''","innerError":{"oAuthEventOperationId":"473b389a-aff0-499c-8f2f-d360ef000b35","oAuthEventcV":"OCVIeZdwIlJrAemUOFDd2w.1.1","errorUrl":"https://aka.ms/autherrors#error-InvalidMsaTicket","requestId":"6ef4ed18-f4d8-4fcc-80c1-2715d9f6a416","date":"2025-03-04T13:17:32"}}}z这个是什么原因呀,大佬
作者: 涤尘    时间: 2025-4-17 20:43
谢谢分享,学习一下
作者: a150590    时间: 2025-4-17 21:46
学习了像大佬
作者: fengk123    时间: 2025-5-1 21:37
为什么我已经拿到Access_token了 ,发送不出去呢? 用python 返回的错误 401,易语言的 返回的是空 , 但是收不到邮件
作者: xhbdzh    时间: 2025-5-18 01:17
微软全套协议,注册,取件,解锁,绑定邮箱,开通令牌,改密,转发,等等,需要+Q:3040088975,W:mgu3668




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4