微信如何设置开发者中心的 “OAuth2.0”网页授权?

微信如何设置开发者中心的 “OAuth2.0”网页授权?,第1张

需要在微信公众后台配置授权回调域名,配置注意事项请参考公众平台接口详细说明,配置成功后,可以通过请求授权页面,直到授权后重定向到回调地址。

具体 *** 作:粘贴如下代码:

public ActionResult WXBind()

{

string sUrl = "/oauth2/access_token?appid=" + ViewUtil.WXappID + "&secret=" + ViewUtil.WXappsecret + "&code=" + Request["code"] + "&grant_type=authorization_code"

WebClient webClient = new WebClient()

Byte[] bytes = webClient.DownloadData(sUrl)

string result = Encoding.GetEncoding("utf-8").GetString(bytes)

JSONObject obj = JSONConvert.DeserializeObject(result)

string sParam = Request["state"]

string sRedictUrl = ""

switch (sParam)

{

case "myorder":

sRedictUrl = "/Account/Order?OpenID=" + obj["openid"] +"&Param=order"

break

case "book":

sRedictUrl = "/Book/WXHotels"break

default:

sRedictUrl = "/Account/Index?OpenID={0}" + obj["openid"]

break

}

Response.Redirect(sRedictUrl)

return View()

}

OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。2012年10月,OAuth 2.0协议正式发布为RFC 6749[1]  。

企业中一般会存在多个系统,假设用户进入每个系统前都需要输入账号/密码登录,在系统个数少的情况下,每次输入账号/密码还能接收;如果系统个数较多,用户则无法接收。单点登录则很好地解决了此问题。

单点登录的原理是用户只需进行一次登录,便可访问多个系统。

可用于单点登录的协议较多,下面将会简单说明一下常见的四种单点登录协议CAS、OAuth2、OpenID、SAML。

CAS协议是一种基于token协议。它用于Web应用的单点登录或登出,协议内容就是规范出一组用于登录/登出的URIs。协议详见: https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol.html

协议涉及到的重要概念如下:

用CAS实现的单点登录流程如下:

理解OAuth2本身,见 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

这里重点提出的是使用Oauth2的单点登录流程:

OpenID最新版本是OpenID Connect,它为OpenID的第三代技术。OpenID Connect允许所有类型的客户端,包括基于浏览器和本机移动应用程序。

OpenID用于终端用户的身份认证,OAuth2用于在已知用户身份合法情况下对客户端的资源授权。OpenID Conect = OpenID + OAuth2。

OpenID Connect基于OAuth协议之上,在OAuth2中有一个特殊的Scope "openid"来标识openid请求,并在OAuth2的返回体中增加一个idtoken的字段来标识用户。

使用OpenID Connect的单点登录流程与Oauth2一致。

目前国内很多应用(浏览器或手机)都支持微信,微博等第三方认证,比如。这种第三方认证可以用OpenID Connect来实现。

注意一般商业应用才会支持使用第三方认证

SAML通过XML进行交互,且基于HTTP之上。

SAML协议中涉及的基本术语下面进行简要介绍。

IdP: Identity Provider, 身份提供商,是指提供身份管理的服务。常见的企业自有IdP有AD FS,Shibboleth等,Cloud IdP有Azure AD,Okta,OneLogin等。

SP: Service Provider,服务提供商,是指利用IdP的身份管理功能,为用户提供具体服务的应用。SP会消费IdP提供的用户信息。在一些非SAML协议的身份系统(比如OIDC)里,也把Service Provider称作Relying Party,也就是IdP的依赖方。

SAML: Security Assertion Markup Language,是一个实现企业级用户身份认证的标准协议。是SP和IdP之间实现沟通的技术实现方式之一。是目前企业身份联盟的的事实标准(SAML 2.0)。

SAML Assertion: 简称Assertion,SAML断言,是SAML协议中用来描述认证请求(Request)和认证响应(Response)的核心元素。例如用户的具体属性就包含在认证响应的断言里面。

Trust: 信赖,是指建立在SP和IdP之间的互信机制,通常由公私钥来实现。SP通过可信的方式获取IdP的的身份联盟元数据,元数据中包括了IdP用来给SAML Assertion签名的私钥的对应公钥,SP则可以使用公钥来验证Assertion的完整性(Integrity)。

参考阿里云单点登录案例: https://m.aliyun.com/doc/document_detail/69969.html

一个参考链接: https://www.jianshu.com/p/5d535eee0a9b

具体选用哪种单点登录方式,需要权衡利弊。

在原先dubbo+zookeeper项目中,web模块只暴露Restful接口,各服务模块只暴露duboo接口,此时用户登录后由web项目进行token的鉴权和验证,并通过dubbo的隐式传参将sessionID传递给dubbo服务模块, 拦截器再根据sessionID从Redis中获取用户信息设置到当前线程

然鹅,在springcloud中,各个微服务直接暴露的是restful接口,此时如何让各个微服务获取到当前用户信息呢?最佳的方式就是token了,token作为BS之间的会话标识(一般是原生随机token),同时也可以作为信息的载体传递一些自定义信息(jwt, 即Json web token)。

为了能更清楚的了解本文,需要对spring-security-oauth 及 jwt有一定了解,本文只关注用户信息传递这一块

认证服务器配置 AuthorizationServerConfigurerAdapter

自定义token转换器

CustomJwtAccessTokenConverter

此时按照固定格式访问授权服务器token接口获取token,如图,可以获取到jwt格式的token,并且额外信息nick_name也已经添加

直接解析jwt字符串可以获取到以下信息,即用户名和授权信息

只需要指定和授权服务器一模一样的token store 和token converter

在securiy的过滤器中 OAuth2AuthenticationProcessingFilter 会从token中获取相关信息进行鉴权

源码:

注意,资源服务器主要配置在

ResourceServerConfigurerAdapter

微服务获取jwttoken中的用户信息,两种方式,使用security上下文可以直接获取当前用户名和权限,另一种自定义拦截器获取额外信息。

这个就简单了,获取header头解析验证token

然后获取之前从授权服务器中的添加的 nick_name的额外信息放入线程变量

其中用户上下文类

启动拦截器注册webmvc配置类

在controller中获取用户信息如图

在默认的认证异常如图

假设我们做了全局异常处理,前端希望在token过期时做统一的登录跳转如何做?

实现 AuthenticationEntryPoint 接口重写 commence 方法即可

注意,直接抛出异常并不会走 @RestControllerAdvice , 因为在这里是response直接返回,并没有使用到Controller处理

此时返回我自定义的Response对象,如图


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11795791.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存