构建OAuth客户端

【OAuth2.0 Client 总结】对接github第三方登录以及其他第三方登录总结 之前搞 oauth 登录一直没有搞好,客户端、授权服务端、资源端一起搞对于我刚接触的小菜鸡来说,难度有点大。然后就先搞了个 Client 端对接 Github 登录。网上关于 Github 登录的资料有很多,而且框架对 Github 集成的也很好,配置起来并不麻烦。 阅读详情

构建OAuth客户端

向授权服务器注册OAuth客户端

客户端标识符

用来标识OAuth客户端,在OAuth协议的多个组件都称其为client_id。在一个给定的授权服务器中,每个客户端的标识符必须唯一,因此客户端标识符总是由授权服务器分配,可以通过开发者门户完成,也可以通过动态客户端注册

共享密钥

client_secret用于客户端与授权服务器交互时进行身份认证

授权码许可类型获取令牌

使用授权码许可类型的交互授权形式,有客户端将资源拥有者重定向到授权服务器的授权端点,然后服务器通过redirect_uri将授权码返回给客户端,最后客户端将收到的授权码发送给授权服务器的令牌端点,换取OAuth访问令牌

发送授权请求

    var client = {
        "client_id": "oauth-client-1",
        "client-secret": "oauth-client-secret-1",
        "redirect_uris": ["http://localhost:9000/callback"]
    };

    var authServer = {
        authorizationEndpoint: 'http://localhost:9001/authorize',
        tokenEndpoint: 'http://localhost:9001/token'
    };

    var buildUrl = function(base, options, hash){
        var newUrl = url.parse(base, ture);
        delete newUrl.search;
        if(!newUrl.query) {
            newUrl.query = {};
        }
        __.each(options, function(value, key, list){
            newUrl.query[key] = value;
        });
        if(hash){
            newUrl.hash = hash;
        }
        return url.format(newUrl);
    };

    app.get('/authorize', function(req, res){
        access_toke = null;
        state = randomstring.generate();
        var authorizeUrl = buildUrl(authServer.authorizationEndpoint, {
            response_type: 'code',
            client_id: client.client_id,
            redirect_uri: cllient.redirect_uris[0],
            state: state
        });

        console.log("redirect", authorizeUrl);
        res.redirect(authorizeUrl)
    });

真正的OAuth客户端应用绝不因该使用像这样的能从外部访问的触发机制,而是因该跟踪内部应用状态,用于确定何时需要请求新的访问令牌

处理授权响应

    app.get('/callback', function(req, res){
        if(req.query.error){
            res.render("error", {error: req.query.error});
            return;
        }
        if(req.query.state != state){
            console.log('State DOES NOT MATCH: expeted %s got %s', state, req.query.state);
            res.render("error", {error: 'State value did not match'});
            return;
        }
        var code = req.query.code;
        var form_date = qs.stringify({
            grant_type: 'authorization_code',
            code: code,
            redirect_uri: client.redirect_uris[0]
        });
        var headers = {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Authorization': 'Basic' + encodeClientCredentials(client.client_id, client.client_secret)
        };
        var tokRes = request('POST', authServer.tokenEndpoint, {
            body: form_data,
            headers: headers
        })
        console.log('Requesting access token for code %s', code);
        if(tokRes.statusCode >= 200 && tokRes.statusCode < 300){
            var body = JSON.parse(tokRes.getBody);
            access_token = body.access_token;
            console.log('Got access token: %s', access_token);
            res.render('index', {access_token: access_token, scope: scope});
        } else {
            res.render('error', {error: 'Unable to fetch access token, server response:' + tokRes.statusCode})
        }
    });

state参数添加跨站保护

防止攻击者向授权服务器暴力搜索有效的授权码,浪费客户端和授权服务器资源,以及导致客户端获取一个从未请求过的令牌,可以使用state可选OAuth参数来缓解这个问题,将该参数设置为一个随机值,并在应用中用一个变量保存。将state添加到通过授权端点URL发送的参数列表中。当授权服务器收到state参数的授权请求时,他必须总是将该state参数和授权码一起原样返回给客户端。客户端可以比较返回的status与原值是否一致,如果不一致向最终用户提示错误。

使用令牌访问受保护资源

客户端要访问受保护资源只需要使用令牌向受保护资源发出调用请求,有3个合法的位置可以用于携带令牌:

  • 使用HTTP Authorization头部,这是规范推荐尽可能使用的方法,最灵活、最安全

使用表单格式请求体参数:

  • 限制受保护资源只能接收表单格式的输入参数,并且要使用POST方法

使用URL编码的查询参数:

  • 可能被无意地泄露到服务器日志中,应为查询参数是URL请求的一部分

获取受保护资源

    app.get('/fetch_resource', function(req, res){
        if(!access_token){
            res.render('error', {error: 'missiong Access Token'});
        }
        console.log('Making request with access token %s', access_token);
        var headers = {
            'Authorization': 'Bearer' + access_token
        };
        var resource = request('POST', protectedResource, {headers: headers});
        if(resource.statusCode >= 200 && resource.statusCode < 300){
            var body = JSON.parse(resource.getBody());
            res.render('data', {resource: body});
            return;
        } else {
            access_token = null;
            res.render('error', {error: resource.statusCode});
            return; 
        }
    });

刷新访问令牌

    app.get('/fetch_resource', function(req, res){
        console.log('Making request with access token %s', access_token);
        var headers = {
            'Authorization': 'Bearer' + access_token,
            'Content-type': 'application/x-www-form-urlencoded'
        }
        var resource = request('POST', protectedResource, {headers: headers})
        if(resource.statusCode >= 200 && resource.statusCode < 300){
            var body = JSON.parse(resource.getBody());
            res.render('data', {resource: body});
            return;
        } else {
            access_token = null;
            if(refresh_token){
                refreshAccessToken(req, res);
                return;
            } else {
                res.render('error', {error: resource.statusCode});
                return;
            }
        }
    });

    var refreshAccessToken = function(req, res){
        var form_data = qs.stringify({
            grant_type: 'refresh_token',
            refresh_token: refresh_token
        });
        var headers = {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Authorization': 'Basic' + encodeClientCredentials(client.client_id, client.client_secret)
        };
        console.log('Refreshing token %s', refresh_token);
        var tokRes = request('POST', authServer.tokenEndpoint,{
            body: form_data,
            headers: headers
        })
        if(tokRes.statusCode >= 200 && tokRes.statusCode < 300){
            var body = JSON.parse(tokRes.getBody());
            access_token = body.access_token;
            console.log('Got access token: %s', refresh_token);
            if(body.refresh_token){
                refresh_token = body.refresh_token;
                console.log('Got refresh token: %s', refresh_token);
            }
            scope = body.scope;
            console.log('Got scope: %s', scope);
            res.redirect('/fetch_resource');
            return;
        } else {
            console.log('No refresh token, asking the user to get a new access token');
            refresh_token = null;
            res.render('error', {error: 'Unable to refresh token.'});
            return;
        }
    }
OAuth2.0与OAuthClientLibrary——开源库的使用与开发 作者:禅与计算机程序设计艺术 OAuth2.0与OAuth Client Library——开源库的使用与开发 随着 OAuth2.0 授权协议的广泛应用,各种 OAuth Client Library 也随之而生。这些库为开发者提供了 阅读详情

相关推荐

【Golang】基于OAuth2.0微信扫码实现客户端用户登录(原理+代码实现+视频讲解)

OAuth 2.0是一种授权协议,用于授权第三方应用访问用户资源,而无需将用户的凭据(例如用户名和密码)直接提供给第三方应用。这种授权机制为用户提供了更好的安全性,同时允许用户更好地控制他们的数据。一个关于授权的开放网络标准 允许用户授权第三方应用访问用户存储在其他服务提供者上的信息 不需要将用户名和密码提供给第三方应用资源所有者(Resource Owner):通常是指用户,拥有访问受保护资源的所有权。(资源所有者,用户)

Jing_Hua 6619

OAuth2-client配置oauth2Login源码解读

本文主要讲述了oauth-client2.0的oauthLogin配置的源码解读,和讲解使用gateway以客户端身份去访问oautn2.0的授权服务器的过程

m0_53097017的博客 2763

7、构建简单 OAuth 客户端指南

本文详细介绍了如何构建一个简单的OAuth客户端,涵盖OAuth 2.0协议的核心流程,包括客户端注册、使用授权码授予类型获取访问令牌、通过访问令牌访问受保护资源、刷新令牌机制,以及不同客户端类型和授权类型的适用场景。同时,还讨论了在实现OAuth时需要注意的关键安全性问题,如保护客户端密钥、使用HTTPS、验证重定向URI、防止CSRF攻击和保护刷新令牌等。通过本文,开发者可以掌握构建安全高效的OAuth客户端的基本步骤和实践方法。

d6e7f8g9h的博客 54

OAuth2.0知识点

应用场景业务流程: 为什么需要申请clientID和clientSecret? 答:HTTP是无状态协议,需要唯一标识客户端为什么ACCESS_TOKEN要放到锚点后面? 答:OAuth2.0允许HTTP协议网址跳转,HTTP协议跳转存在中间人攻击风险。浏览器跳转时,锚点不会发到服务器应用场景业务流程: 四种模式/客户端模式 应用场景业务流程: 四种模式/授权码模式 总结 URL总结:你是谁、你要什么、我怎么给你、范围保存位置总结:开发流程总结:先开发认证授权服务,再开发资源服务四种角色总结:应用场景:授权

求道问术 2557

7、构建简单OAuth客户端指南

本文详细介绍了如何构建一个简单的OAuth客户端,涵盖向授权服务器注册客户端、使用授权码授权类型获取访问令牌、访问受保护资源以及刷新令牌等步骤。同时,还讨论了不同客户端类型和授权类型的适用场景及安全注意事项,帮助开发者更好地理解和应用OAuth协议。

rgv23456789的博客 59

8、构建简单的OAuth客户端与受保护资源

本文详细介绍了如何构建一个简单的OAuth客户端与受保护资源。内容涵盖获取和刷新访问令牌的步骤,解析和验证OAuth令牌的方法,以及根据作用域和资源所有者对请求进行差异化处理的策略。同时,还包括错误处理建议和系统优化方法,帮助开发者构建安全可靠的OAuth系统。

rgv23456789的博客 46

【经验分享】Spring Security OAuth2 客户端实现详解:构建基于OAuth2的应用客户端

本文详细介绍了使用Spring Security实现OAuth2客户端认证的技术方案。

泽济天下的专栏 1077

8、构建简单的 OAuth 客户端与受保护资源

本文详细介绍了如何构建一个简单的 OAuth 客户端与受保护资源。重点讲解了 OAuth 2.0 中访问令牌的刷新机制,包括如何处理令牌过期、刷新令牌的使用以及失败处理。同时,还展示了如何创建一个受保护资源,解析和验证 OAuth 令牌,并基于令牌的有效性处理请求。最后,总结了客户端和受保护资源的实现要点,并探讨了实际应用中的安全性、性能优化和扩展性问题,以及常见问题的解决方案。通过本文,读者可以掌握构建安全、高效的 OAuth 认证系统的关键步骤和技术。

d6e7f8g9h的博客 41

完整教程:如何使用Ruby OAuth 2.0构建安全的API客户端

OAuth 2.0是现代应用开发中保护API访问的行业标准协议,而Ruby OAuth 2.0库(oauth2)为Ruby开发者提供了简洁高效的实现方案。本教程将带你快速掌握使用这个强大工具构建安全API客户端的核心步骤,从环境配置到实际授权流程,让你轻松应对各种OAuth 2.0场景。 ## 一、快速入门:安装与基础配置 要开始使用Ruby OAuth 2.0库,首先需要在你的Ruby项目中

gitblog_00054的博客 375

大模型抽取知识图谱三元组的可行性分析

通过结合传统信息抽取模型与大语言模型的混合架构,可高效完成从学术文献到知识图谱三元组的全流程构建。分阶段优化:传统模型负责粗粒度抽取,大模型负责细粒度修正。灵活提示设计:通过少样本学习引导大模型理解领域本体。严格质量控制:结合规则引擎和人工校验,确保三元组准确性。该方案可显著提升知识图谱构建效率,适用于学术研究、企业知识库等场景。

qq_20647053的博客 1067

【全新官方接口】php检测微信域名拦截,检测微信域名被封

你的域名在微信被拦截的3种常见情况 1、域名因违规或有风险被拦截(红色拦截) 2、类似taobao.com,douyin.com这种的恶意竞争式拦截,淘宝、抖音等微信的竞争对手一般都是白色拦截(白色拦截) 3、有一个中间页的拦截,需要多次点击按钮才可以跳转到你的域名的,多是一些新型域名后缀,例如.top .xyz .link后缀,这种情况,备案后可以解决(备案拦截) 通过php get_headers()函数就可以分析到结果 这个下标为6是一个URL,在微信访问后正是这个讨厌的页面! 如果切换为

TANKING,开源开发者! 2880

一天一个Python库:oauthlib - 轻松构建OAuth客户端和服务器

注意:templateName、createAsContainerDatabase必須指定。修改db_install.rsp文件中以下内容。12.1.编辑dbca.rsp安装文件。1.7.关闭防火墙还有selinux。10.2.静默安装Oracle软件。1.6.解析/etc/hosts。6./etc/profile配置。10.静默安装Oracle数据库。查看是否安装有Oracle软件。4.配置Oracle的环境变量。以下在root用户下操作。oracle用户下操作。oracle用户下操作。

Ixm79uw2V的博客 323

Unity3d移动端性能优化

以下条目主要针对移动端,大部分也适合PC端 一、Profiler的使用 1.性能优化应贯穿项目开发的全过程,如需求(性能能不能达到要求)、设计、开发、测试等。不能开发结束才优化性能。 2.官方推荐的优化工具是【Window】->【Profiler】 3.确认瓶颈是CPU-bound(Gfx.WaitForCommands)还是CPU-bound(Gfx.WaitForPresent) 4.内存分析使用Memory Profiler 二、内存优作 5.减少内存收集的影...

zouxin_88的专栏 3063

Flutter 跨平台实践:为鸿蒙生态构建 AtomGit OAuth 客户端

本文分享了使用Flutter为鸿蒙生态构建AtomGit OAuth授权客户端的实践经验。文章详细阐述了如何利用Flutter的跨平台优势,高效开发并封装OAuth 2.0服务,实现一次编写即可在鸿蒙、Android和iOS多端部署,帮助第三方服务快速、低成本地接入鸿蒙生态,并提供一致的用户体验。

night的博客 433

特征提取神操作,登上Nature!计算速度狂提300%!

登上Nature!作者提出CVOCA,一种能同时处理数据的幅度和相位信息的卷积模型,在性能远超SOTA的同时,计算速度更是狂飙300%!实际上,作为机器学习和深度学习的核心技术,特征提取一直都是研究的热门!它直接影响着模型的准确性、计算效率、可解释性……同时,它也是我们改模型涨点,最好操作的部分!因为可切入点的真的非常之丰富,不管是轻量化、多尺度、时域与频域结合等,都能使模型性能得到提升!

2401_82426425的博客 4038

MIKE水动力笔记17_MIKE文件转shp、统计每个单元格的面积

MIKE的工具箱中自带一个转shp的工具,然后可以拖进ArcGIS中很方便的统计每个单元格的面积和每个网格点的水深。

晏长街的博客 4153

一天一个Python库:oauthlib - 轻松构建OAuth客户端和服务器矫

注意:templateName、createAsContainerDatabase必須指定。修改db_install.rsp文件中以下内容。12.1.编辑dbca.rsp安装文件。1.7.关闭防火墙还有selinux。10.2.静默安装Oracle软件。1.6.解析/etc/hosts。6./etc/profile配置。10.静默安装Oracle数据库。查看是否安装有Oracle软件。4.配置Oracle的环境变量。以下在root用户下操作。oracle用户下操作。oracle用户下操作。

qt7xI1yfy的博客 341

使用 WSL 在 Windows 上安装 Linux

开发人员可以在 Windows 计算机上同时访问 Windows 和 Linux 的强大功能。通过适用于 Linux 的 Windows 子系统 (WSL),开发人员可以安装 Linux 发行版(例如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等),并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具,不用进行任何修改,也无需承担传统虚拟机或双启动设置的费用。

隔壁老瓦的专栏 2872

一天一个Python库:oauthlib - 轻松构建OAuth客户端和服务器用

注意:templateName、createAsContainerDatabase必須指定。修改db_install.rsp文件中以下内容。12.1.编辑dbca.rsp安装文件。1.7.关闭防火墙还有selinux。10.2.静默安装Oracle软件。1.6.解析/etc/hosts。6./etc/profile配置。10.静默安装Oracle数据库。查看是否安装有Oracle软件。4.配置Oracle的环境变量。以下在root用户下操作。oracle用户下操作。oracle用户下操作。

zzS1acYff的博客 272

基于图像形态学处理的交通灯检测识别matlab仿真

图像形态学处理是基于数学形态学的理论,利用结构元素(如矩形、圆形等)对图像进行处理,通过将结构元素与图像进行特定的逻辑运算,来提取图像中的目标特征、去除噪声、改善图像质量等。在交通灯检测识别中,主要利用交通灯的颜色、形状等特征,通过形态学操作突出这些特征,抑制背景和噪声干扰,从而实现对交通灯的准确检测和识别。图像采集与预处理采集:通过安装在车辆或道路上的摄像头获取交通场景图像。灰度化:将彩色图像转换为灰度图像,减少数据量,便于后续处理。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 160

34、Text2KGBench与GeoQuestions1089:知识图谱生成与地理空间问答的新进展

本文介绍了Text2KGBench和GeoQuestions1089在知识图谱生成与地理空间问答领域的最新进展。Text2KGBench提供了一个开放且可复现的基准,用于从文本生成知识图谱,并结合多个LLM模型和评估工具推动研究。GeoQuestions1089是目前最大的地理空间问答数据集,与GeoQA2系统结合,推动了地理空间问答系统的发展。文章还探讨了技术挑战和未来研究方向,包括多模态知识图谱生成和深度学习优化的地理空间问答系统。

css33的专栏 116

一天一个Python库:oauthlib - 轻松构建OAuth客户端和服务器耐

注意:templateName、createAsContainerDatabase必須指定。修改db_install.rsp文件中以下内容。12.1.编辑dbca.rsp安装文件。1.7.关闭防火墙还有selinux。10.2.静默安装Oracle软件。1.6.解析/etc/hosts。6./etc/profile配置。10.静默安装Oracle数据库。查看是否安装有Oracle软件。4.配置Oracle的环境变量。以下在root用户下操作。oracle用户下操作。oracle用户下操作。

lu61Yyuf3的博客 307

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: OAuth组件
下一篇: 构建简单的OAuth受保护资源
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值