OAuth机制_web站点接入微软azure账号进行三方登录

news2024/10/5 18:31:07

文章目录

    • ⭐前言
    • ⭐微软三方登录流程
      • 💖 web站点获取微软账号流程
      • 💖 node封装微软登录接口
      • 💖 webapp 自定义code换token
      • 💖 调用 Microsoft Graph API
      • 💖 前端唤醒authlink进行登录回调逻辑
    • ⭐结束

yma16-logo

⭐前言

大家好,我是yma16,本文分享OAuth规则机制下实现个人站点接入微软azure账号进行三方登录。
该系列往期文章:
前端笔记_OAuth规则机制下实现个人站点接入qq三方登录

oauth授权

OAuth是一种授权机制,用于允许用户(资源所有者)向第三方应用程序授予有限的访问权限,而不必将凭证直接提供给第三方应用程序。OAuth的目的是为了保护用户的私密数据,如社交媒体帐户、云存储、银行帐户等。它通过一个流程,将用户授权给第三方应用程序访问用户的资源,而不需要第三方应用程序获得用户的凭证信息。这样做可以减少用户数据泄露的风险。OAuth是一个开放的标准,由OAuth工作组维护,并得到许多组织的支持和使用。

oauth的发展

OAuth协议的发展历史可以追溯到2004年,当时美国国防部提出了一个名为“OpenID Connect”的开放式身份认证和授权标准,旨在解决Web 2.0中的身份认证和授权问题。OAuth1.0于2005年被RFC 5849正式标准化,OAuth2.0于2011年被RFC 6749正式标准化 。

OAuth1.0的主要特点是将用户的认证信息(如用户名和密码)与第三方应用的请求分离开来,从而提高了安全性。
OAuth2.0则在OAuth1.0基础上进一步改进,增加了更多的功能和灵活性,如授权码模式、隐式模式、密码模式等 。

效果
azure-web-auth

⭐微软三方登录流程

前提条件:存在前端站点
注册微软应用:https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade
创建appid
azure-app
提交审核.

💖 web站点获取微软账号流程

流程文档:https://learn.microsoft.com/zh-cn/azure/active-directory/develop/v2-oauth2-auth-code-flow
官方接入流程图:
azure
接入步骤:

  1. 唤起三方登录授权url
  2. 登录成功返回定义的回调地址redirect_uri带code
  3. 使用code去换取token
  4. token拿到id和refreshToken
  5. 使用refreshToken去访问 Microsoft graph api

web 登录身份验证流
web-auth
单页面应用spa交互流程
交互流程
zh-script

💖 node封装微软登录接口

组装三方url
封装url的函数,已处理脱敏

const request = require('request');

// Microsoft 帐户和工作或学校帐户的 common
const tenant='common';
const loginUrl=`https://login.microsoftonline.com/${tenant}/oauth2/v2.0/authorize`;
const codeToTokenUrl=`https://login.microsoftonline.com/${tenant}/oauth2/v2.0/token`;
const aboutInfoUrl='https://graph.microsoft.com/v1.0/me';
// 客户端id
const clientId='***';
// 对象id
const objectId='***';
const redirect_uri='https://yongma16.xyz/third-login/azure_login_callback';
const getAzureAuthUrl=(state)=>{
    return new Promise(resolve=>{
        //code_challenge=pmwq-hZFKj0arSiO6WXFHngszqW0cH0fwMpd-a1Vuns&code_challenge_method=S256
        const params={
            client_id:clientId,
            scope:['User.Read'].join(encodeURIComponent('&')),
            redirect_uri:encodeURIComponent(redirect_uri),
            // 返回的方式
            response_mode: 'query',
            response_type:'code',
            code_challenge:'***',
            code_challenge_method:'S256',
            state:state?state:'myblog',
        };
        const path=Object.keys(params).map(key=>{
            return `${key}=${params[key]}`
        }).join('&');
        const url=loginUrl+'?'+path;
        resolve(url)
    })
};

封装code换取token的函数
注意:

  • redirect_uri不进行encode
  • spa需要code_verifier
  • webapp 需要secrect
const getAzureToken=(code)=>{
    return new Promise(async ( resolve ,reject)=> {
        const formData={
            client_id:clientId,
            scope:['User.Read'].join(encodeURIComponent('&')),
            code:code,
            redirect_uri:redirect_uri,
            // redirect_uri:encodeURIComponent(redirect_uri),
            grant_type:'authorization_code ',
            code_verifier: '***',
            client_secret:'***',
        }
        console.log('formData',formData)
        request.post({url:codeToTokenUrl, formData: formData}, function optionalCallback(err, httpResponse, body) {
            if (err) {
                console.error('upload failed:', err);
                reject(err)
            }
            console.log('Upload successful!  Server responded with:', body);
            resolve(httpResponse)
        });
        }
    )
}

client_secret获取
web-secret
效果调用有问题:
反馈 只能通过跨源请求兑换

Tokens issued for the 'Single-Page Application' client-type should only be redeemed via cross-origin requests

封装token换取id_token的函数

// 获取web api
const getAzureUserInfo=(access_token)=>{
    const Authorization="Bearer " + access_token;
    return new Promise(async ( resolve ,reject)=> {
            request(
                {
                    method: 'GET',
                    uri: aboutInfoUrl,
                    headers:{
                        'Authorization':Authorization
                    }
                }, function (error, response) {
                    console.log('response',response)
                    if (!error && response.statusCode === 200) {
                        resolve(response)
                    } else {
                        console.log("error",error);
                        resolve(reject)
                    }
                })
        }
    )
}

💖 webapp 自定义code换token

由于只能通过跨源请求兑换
解决方案:
切换为调用 Microsoft Graph API的demo,使用对外暴露接口让web使用就可以切换token

💖 调用 Microsoft Graph API

spa使用Microsoft Graph API
链接直达:https://learn.microsoft.com/zh-cn/azure/active-directory/develop/tutorial-v2-javascript-auth-code

个人demo示例:https://yongma16.xyz/node_azure/
demo-azure

💖 前端唤醒authlink进行登录回调逻辑

步骤:

  1. 拿到微软三方登录url
  2. 登录成功回调code
  3. 使用code换token
  4. token拿openid
 async azureLogin () {
     try {
         const that = this
         // qq
         const res = await that.getAzureUrl()
         console.log('res azureLogin', res)
         if (res.data && res.data.data) {
             const resData = res.data.data
             console.log('resData', resData)
             if (res.data.code === 200) {
                 let url = resData
                 console.log('url', url)
                 const openHandle = window.open(url, 'width:800px;height:700px', '_black')
                 console.log('openHandle', openHandle)
                 window.onmessage = async (res) => {
                     const {origin, data} = res
                     if (origin.includes('yongma16.xyz')) {
                         const {code, state} = data
                         console.log('code state', code, state)
                         that.thirdLoginConfig.qCode = code
                         that.thirdLoginConfig.qState = state
                         if (openHandle) {
                             openHandle.close()
                         }
                         if (code) {
                             await that.getAzureToken(code)
                         }
                     }
                 }
             }
         }
         return new Promise(resolve => {
             resolve(true)
         })
     } catch (e) {
         return new Promise((resolve, reject) => {
             reject(e)
         })
     }
 },
 getAzureUrl () {
     return new Promise(async (resolve, reject) => {
         try {
             const azureAuthUrl = '/third-login/getAzureAuthUrl'
             const azureRes = await this.$axios.get(azureAuthUrl)
             console.log('azureRes', azureRes)
             resolve(azureRes)
         } catch (e) {
             reject(e)
         }
     })
 },
 async getAzureToken (code) {
     try {
         const azureAuthTokenUrl = '/third-login/getAzureToken'
         const params = {
             code
         }
         const azureRes = await this.$axios.get(azureAuthTokenUrl, {params})
         console.log('azureRes', azureRes)
     } catch (e) {
         console.log('e', e)
     }
 },

效果:
login-azure

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
blue-sky-boy

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 感谢你的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React(1)——快速入门

一、React背景简介 官网和资料 英文官网: https://reactjs.org/中文官网: 快速入门 – React (docschina.org) 3、如果JS基础忘了及时查看文档:JavaScript - 学习 Web 开发 |多核 (mozilla.org) JavaScript - 标签 - 汤姆大叔 - 博客园 (cnblogs.com) 4、React…

day49-Todo List(待办事项列表)

50 天学习 50 个项目 - HTMLCSS and JavaScript day49-Todo List&#xff08;待办事项列表&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" co…

缓存数据同步技术Canal

说明&#xff1a;缓存数据同步&#xff0c;以Redis为例&#xff0c;如何保证从Redis中取出来的数据与MySQL中的一致&#xff1f;在微服务架构下&#xff0c;通常可以用以下两种技术来实现&#xff1a; MQ&#xff1a;在修改数据的同时&#xff0c;发送一个消息修改缓存&#x…

SpringBoot月度员工绩效考核管理系统【附任务书|ppt|万字文档(LW)和搭建文档】

主要功能 员工登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、个人信息管理等 ②公告信息管理、绩效指标管理、绩效考核管理 管理员登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、个人信息管理等 ②公告信息管理、部门管理、岗位管理、员工管理、绩效指标…

神奇数学世界的魔力迷踪:破解3的幂次方之谜

本篇博客会讲解力扣“326. 3 的幂”的解题思路&#xff0c;这是题目链接。 昨天刚刚讲解完2的幂&#xff0c;今天就来看看3的幂。 思路1 3的幂不能像2的幂那样&#xff0c;直接看二进制中是否有且仅有一位为1&#xff0c;所以“2的幂”那道题中的前两种方法就失效了&#xff…

《MySQL 实战 45 讲》课程学习笔记(一)

基础架构&#xff1a;一条 SQL 查询语句是如何执行的&#xff1f; MySQL 的基本架构 MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层 包括连接器、查询缓存、分析器、优化器、执行器&#xff1b;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&…

【雕爷学编程】MicroPython动手做(18)——掌控板之声光传感器2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

YOLOv5改进最新ICCV2023顶会LSKNet:大选择性卷积核的领域首次探索,助力小目标检测

YOLOv5改进最新ICCV2023顶会LSKNet:大选择性卷积核的领域首次探索,助力小目标检测 一、论文总结特征融合策略(即空间选择机制)二、代码部分,将LSKNet结构加入到YOLOv5中。论文:https://arxiv.org/pdf/2303.09030.pdf 代码https://github.com/zcablii/LSKNet/blob/main/mm…

【屏幕适配发展介绍 Objective-C语言】

一、接下来,我们花一天时间,给大家介绍这个屏幕适配 1.那么,屏幕适配,是什么意思啊 我们说,写程序的时候,我们有时候要做 1)系统适配 2)屏幕适配 1)系统适配:是指的你写的这个代码,在iOS6、iOS7、iOS8,在不同的iOS系统下,是不是运行的效果,一致吧 这个指的是…

【读书笔记】《太白金星有点烦》

哦吼&#xff01;这次开了一本轻松愉悦的书。 太白金星和观音分属于两个不同的部门&#xff0c;也有不同的领导&#xff0c;为了完成九九八十一难的策划而暂时合作。观音开始并瞧不上这个老头&#xff0c;对他极度欺瞒&#xff0c;但老头也不是任人揉捏的软柿子&#xff0c;给…

【雕爷学编程】MicroPython动手做(17)——掌控板之触摸引脚

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Tailwind CSS:基础使用/vue3+ts+Tailwind

一、理解Tailwind 安装 - TailwindCSS中文文档 | TailwindCSS中文网 Installation - Tailwind CSS 1.1、词义 我们简单理解就是搭上CSS的顺风车&#xff0c;事半功倍。 1.2、Tailwind CSS有以下优势 1. 快速开发&#xff1a;Tailwind CSS 提供了一些现成的 class / 可复用…

Redis如何实现排行榜?

今天给大家简单聊聊 Redis Sorted Set 数据类型底层的实现原理和游戏排行榜实战。特别简单&#xff0c;一点也不深入&#xff0c;也就 7 张图&#xff0c;粉丝可放心食用&#xff0c;哈哈哈哈哈~~~~。 1. 是什么 Sorted Sets 与 Sets 类似&#xff0c;是一种集合类型&#xff…

C++笔记之迭代器失效问题处理

C笔记之迭代器失效问题处理 code review! 参考博文&#xff1a;CSTL迭代器失效的几种情况总结 文章目录 C笔记之迭代器失效问题处理一.使用返回新迭代器的插入和删除操作二.对std::vector 来说&#xff0c;擦除&#xff08;erase&#xff09;元素会导致迭代器失效 一.使用返回…

PM2.5传感器(PMS5003)STM32代码

PM2.5传感器型号&#xff1a;PMS5003 PMS5003简介如下&#xff1a; 详情&#xff1a;PMS5003资料链接 PM2.5传感器代码下载&#xff0c;本人所写&#xff0c;亲测有效&#xff0c;基于STM32F407(其他STM32型号皆可移植&#xff0c;只需修改UART参数即可),UART打印数据

SpringBoot —程序包org.springframework.boot.test.context不存在

一. 遇到问题 &#xff1a;程序包org.springframework.boot.test.context不存在 发生错误的原因是项目中缺少spring-boot-starter-test依赖导致的&#xff0c;解决方案如下: 在项目根目录的pom.xm文件中的<dependencies>节点下增加以下依赖即可&#xff1a; <depen…

未来十年最确定的事

变量&#xff08;比如人工智能&#xff09;增加后&#xff0c;世界变成一个超复杂的系统&#xff0c;我们甚至不知道未来十年是战争还是和平&#xff0c;是增长还是震荡。但有一个事却百分百确定&#xff1a;硅基智能注定崛起&#xff0c;然后在生产、生活等各个环节反复和碳基…

Spring Boot实践四 --集中式缓存Redis

随着时间的积累&#xff0c;应用的使用用户不断增加&#xff0c;数据规模也越来越大&#xff0c;往往数据库查询操作会成为影响用户使用体验的瓶颈&#xff0c;此时使用缓存往往是解决这一问题非常好的手段之一。Spring 3开始提供了强大的基于注解的缓存支持&#xff0c;可以通…

xcode中如何显示文件后缀

xcode14.3 用不惯mac电脑真恶心&#xff0c;改个显示文件后缀找半天 1、首先双击打开xcode软件 2、此时&#xff0c;电脑左上角出现xcode字样(左上角如果看不到xcode字样&#xff0c;再次点击xcode软件弹出来就有了)&#xff0c;鼠标右键它&#xff0c;点击setting或者Prefere…

算法通过村第二关-链表白银笔记|指定区间反转

文章目录 前言链表反转|指定区间内头插法&#xff1a;穿针引线法&#xff1a; 总结 前言 提示&#xff1a;人啊&#xff0c;果然跟花一样&#xff0c;开花前的等待无比漫长&#xff0c;绽放的魅力却转瞬即逝。 链表反转|指定区间内 参考题目&#xff1a;92. 反转链表 II - 力…