4月,

好几天时间想起来,我4月没有记录点什么,没发点什么文章,不管是技术的,开源的,还是生活的,所思所想的.

后来我还是决定写点记录点,连标题都不太清晰,名叫4月.

感觉对开源的热情在下降,是计划着继续更新完善OAUTH2相关的知识介绍与内容,还是没有去行动记录于纸上或文章里.

在码不完的代码中,继续着码代码—这类似生活.

我还记得租房一个人时,有了房子也继续是一个人在很多的时间中看着书,继续着前进.

技术,不能停止;脑子,不能静止,感觉于此.

每日来共享单车中徘徊与周旋, 感觉是既锻炼又费力.

 

感觉脑子进水去拍了CT,等等结果,等待报告出来…

脑子本来就有水,无需进水.

感觉看书中才能有所寄托与进步,就在床头,沙发上,背包中,到处着书的影子. 依旧感觉到上厕所时是最好的看书时光,简单快捷且两不误,只要起身时脚不发麻即可.

以往的总是一本书一本书地看完,而现在是转变为多本书多线程地并行着看.

多年以来,唯有书才感觉是系统学习的来源与未来的可支撑物.

在感觉快有4月18日这个有些特殊的日子来临前写下点思绪有些乱的现状.

等待着又一波的网络营销,电子商务平台的盛宴(感觉会是).

 

关于编程,更多的是叫编程思想, 思想才是目的,而编程只是过程; 编程是量变,思想是量变的升华,是质变;

在编程中思考,思索,思念,思乡,最后变成思想.

我不用更多的思想,行动才是王道,行动才能解决问题.

请别在思想.

 

不知啥的,一说到4月,就想到秋生.

MyOIDC – 基于OIDC协议的开源项目

在之前的博客文章中, 曾不止一次介绍了OIDC协议及相关知识(详细访问: https://andaily.com/blog/?s=OIDC)

现在,开始一个新的开源项目: MyOIDC (https://git.oschina.net/mkk/MyOIDC), 将其相关的知识与实现给代码化,

我们将着重提供比OAuth2实现更好,更安全的认证与授权 安全框架实现.

 

顺便传播OIDC, 使用OIDC, 拥抱OIDC…

欢迎你的关注与支持…

 

https://git.oschina.net/mkk/MyOIDC

openid

spring-oauth-server 如何扩展使用其他数据存储方式

spring-oauth-server项目默认提供了MYSQL数据库进行数据存储, 另一个branch: mongodb 使用了MongoDB进行数据存储.

但如果你想在使用时用其他的数据存储方式(如ORACLE,SQL SERVER, REDIS),该如何办呢? 以下给出一些思路, 希望能帮上你.

理论准备:

spring-oauth-server项目实际是一个基于Spring框架的, 而Spring的核心思想是什么——面向接口编程, 而面向接口编程带来的好处就是扩展性很强(不是一般的强), 以此为出发点来思考.

同时想想默认的spring-oauth-server使用MYSQL时有哪些数据进行了存储, 就寻找这些存储相关的类进行扩展.

具体实现:

(以mongodb 分支为例)

1.扩展接口TokenStore.java, 写自己的TokenStore实现类, 参见MongoTokenStore.java类. 同时在security.xml中配置tokenStore时使用自己扩展的类,如下图:

tokenStore

2.扩展接口ClientDetailsService.java,写自己的ClientDetailsService实现类, 参见MongoClientDetailsService.java类,同时在security.mxl中配置clientDetailsService时使用自己扩展的类,如下图:

clientDetailsService

3.扩展接口AuthorizationCodeServices.java,写自己的AuthorizationCodeServices实现类, 参见MongoAuthorizationCodeServices.java类,同时在security.xml中配置authorizationCodeServices时使用自己扩展的类,如下图:

authCode

 

OK, 在实现上面3个步骤后, 扩展实现数据存储方式就差不多了(当然,写一些辅助类是不错的,如MongoTokenStore实现时注入使用了AccessTokenRepository; 这能带来代码结构清晰,维护方便 ,扩展性强等好处), 以上的3个接口都有些抽象的或默认的实现类,如TokenStore默认时使用的实现类为InMemoryTokenStore.java, 借助强大的IDE工具去查看各个接口已有的实现类, 仿照或参考去扩展实现自己需要的实现类并配置即可, 比如可以继承一些已有的实现类进行覆盖扩展也是不错的主意.

 

编程之艺在于融会贯通,周而复始; 在于一种思想思考—面向期望编程!!!

 

spring-oauth-server 0.6 发布,OAuth2 与 Spring Security 安全应用整合

spring-oauth-server 0.6版本发布,该版本主要增加有缓存的支持, 具体的功能更新如下:

  • (150) – 修改OAUTH错误时返回JSON数据
  • (151) – 数据添加Ehcache缓存支持
  • (158) – 对配置,代码必要的地方添加注释,方便理解
  • 添加OIDC协议文档

OIDC是基于OAuth2的下一代身份认证授权协议,在0.6版本中添加了对OIDC1.0版本协议文档,同时在进行中文的翻译,具体请访问 https://andaily.com/blog/?p=440

spring-oauth-server 是一个整合OAuth2与Spring Security的安全应用项目,是从https://github.com/spring-projects/spring-security-oauth/tree/master/spring-security-oauth2扩展的符合实际项目需要的开源项目,可扩展为移动SSO解决方案.

0.6版本访问地址: http://git.oschina.net/shengzhao/spring-oauth-server/tree/0.6/

 

oauth2-shiro 0.2版本发布

oauth2-shiro 0.2版本正式发布, 在7月完成开发工作,但由于当时发布 http://git.oschina.net/mkk/oauth2-shiro-redis 项目竟然给忘记了. 该版本主要更新如下

1.更新首页UI, 参照spring-oauth-server

2.Add client details overview

3.Add client details testing

4.user add/edit, overview

5.添加API使用说明, 举例各个场景

6.发布到测试服务器

7.resources模块更新UI说明

 

从0.2版本开始可在线测试,测试地址分别为:

authz: https://andaily.com/authz/

resources:https://andaily.com/rs/

0.2版本访问地址: http://git.oschina.net/mkk/oauth2-shiro/tree/0.2/

oauth2-shiro 整合OLTU与SHIRO, 提供一个轻量的OAUTH2应用框架.

正确处理spring-oauth-server中在验证失败或错误时的方式

在文章 https://andaily.com/blog/?p=97 中提到了OAUTH验证失败或错误时的处理办法, 但该方式是不完美的.

通过剖析代码发现,为什么在浏览器中会返回XML格式的数据, 而在使用类似HttpClient的请求时返回的数据格式为JSON,

其实所有的根源都在于请求header中的Accept的值所决定的,如果Accept不支持application/json, 那服务端肯定不会返回JSON格式的数据,

通过浏览器的开发者工具很容易追踪,如下图:

web_response_xml

 

从图中可以看出我们在请求时header中Accept的值为:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8; 服务器响应401

没有json格式的 media type, 但有xml的, 所以返回的数据格式不会是JSON的在浏览器请求时, 同时请注意 response header中的WWW-Authenticate.

 

相同的请求,如果我们换一种方式, 如Postman, 其结果返回的却是JSON格式的.如下图:

postman_response_json1

 

这也是因为请求时的header中Accept导致的, 看下图:

postman_response_json2

 

Postman在请求时的Header中设置了Content-Type: application/json; 同时也注意WWW-Authenticate.

 

综上分析, 你应该知道如何在请求时设定响应时的数据格式了吧. 方法如下:

1. 如果能指定Header中的Accept或Content-Type, 则指定为具体的数据类型或 media type  (一般用在非浏览器环境)

2.不管返回的数据体(response body)是XML还是JSON, 通过响应的header来处理, 如果响应码不是200, 则获取Header中WWW-Authenticate的值.

通过解析WWW-Authenticate的值来获取错误信息 (适用几乎所有环境)

 

 

http://git.oschina.net/shengzhao/spring-oauth-server

传递access_token参数的正确方式

在OAuth中, access_token参数的传递如何才能更安全呢? 不知你有没有具体去研究过, 在此总结传递access_token的正确方式,

(所谓正确方式是指传递方式更安全, 更隐匿, 更不容易被网络拦截,网络攻击的方式)

 

在 spring-oauth-server 与 oauth2-shiro 中均支持以下提到的传递access_token的方式.

 

1. 通过Header传递 access_token; [推荐]

在请求URL的Header中, 添加header -> Authorization: bearer access_token,  示例代码(Java):

postHandler.addHeader("Authorization", "bearer 0fe12a74-e613-4d1b-9785-f96847bad346");

一般在代码中使用httpclient或URLConnection来实现,如Android, IOS客户端, 不适用于浏览器传递access_token

2.若请求URL使用POST方式提交, 将access_token放在请求body中而不是拼接在URL上, 示例代码(HTML):

<form action="db_table_description" method="post">
    <input type="hidden" name="access_token" value="0fe12a74-e613-4d1b-9785-f96847bad346"/>
    <input type="text" name="username"/>
    <button type="submit">Submit</button>
</form>

3.最后的选择, 通过URL拼接参数access_token, 示例代码:

http://monkeyk.com/oauth_test?access_token=0fe12a74-e613-4d1b-9785-f96847bad346

一般使用在GET请求, POST等其他请求方式也支持

以上三种方式, 优先选择第一,第二种, 少用第三种方式.这些方式都是基于HTTP请求下所采用的.
更安全的传递access_token的方式是启用HTTPS连接,保证网络传输安全.

spring-oauth-server 0.5 发布,OAuth2 与 Spring Security 安全应用整合

spring-oauth-server 0.5版本发布,该版本的功能更新如下:

  • (144) – Add MongoDB branch
  • (143) – Add project API document
  • (139) – User Overview/ user add/archive
  • (138) – OAuth Restful API
  • (118) – Add java-config(零配置) 的支持, 以及启用 新的注解.

spring-oauth-server 是一个整合OAuth2与Spring Security的安全应用项目,是从https://github.com/spring-projects/spring-security-oauth/tree/master/spring-security-oauth2扩展的符合实际项目需要的开源项目,可扩展为SSO解决方案。

0.5版本访问地址: http://git.oschina.net/shengzhao/spring-oauth-server/tree/0.5/

OIDC–基于OAuth2的下一代身份认证授权协议

OIDC(OpenID Connect), 下一代的身份认证授权协议; 当前发布版本1.0;

OIDC是基于OAuth2+OpenID整合的新的认证授权协议; OAuth2是一个授权(authorization)的开放协议, 在全世界得到广泛使用, 但在实际使用中,OAuth2只解决了授权问题, 没有实现认证部分,往往需要添加额外的API来实现认证; 而OpenID呢,是一个认证(authentication )的协议, 二者在实际使用过程中都有其局限性;

综合二者,即是OIDC; 通过OIDC,既能有OAUTH2的功能,也有OpenID的功能; 恰到好处…

OIDC将是替换(或升级)OAuth2, OpenID的不二选择..

OIDC在OAuth2的access_token的基础上增加了身份认证信息; 通过公钥私钥配合校验获取身份等其他信息—– 即idToken;

一个使用JWT生成的idToken(base64):

eyJhbGciOiJSUzI1NiIsImtpZCI6IjM3MTc2NjA0OTExODEyNzkwNzgifQ.eyJpc3MiOiIxMTExIiwiYXVkIjoiMTExMSIsImF0X2hhc2giOiI4ZjgxYThjOS1jNWJiLTQwOWMtYjI0Ni1lMzEyZmUwYzM4NWMiLCJyZWdpc3RyYXRpb24iOiIxMjM0NTY3OCIsImV4cCI6MTQ2MzYyMjA4NiwianRpIjoiRnl5aGZOYnQtU0NLR2tpTWRGMVg2dyIsImlhdCI6MTQ2MzU3ODg4NiwibmJmIjoxNDYzNTc4ODI2LCJzdWIiOiJsc3otb2lkYyJ9.hDCcs8PISdwUPp6Eyd-9JCeeTJ2ZtscBeuPITIt43gMYbddiUBLC90uT9bxKe6e3awHels3asEMreFtlnlY09PwdCxXvhjYcEiXO_dnzqu-zQXESHzPEE6d1WsZUcbj6yxoxMh0laba24uu3CbqSRQbOrsYmh2_XA5Q5eP66iOajRUDhNXhmsWEL85jtL9_h0SyfRNPZ9C0mRu2x9YZTHT129O53ggqtjwQxrXLAbCd1dd35DyIztagqQWDpo3gFG7YseNEiQ6Mf2D6nIBU9llAqH4sTThq_ahME06qKENat_sxnmIJN2UHw7u0E08S-59oxtOY9winT78Qj5IfWJw

 

在OIDC协议的实现中, 其底层是基于OAuth2. 一些常用的库如: JWT(https://jwt.io/), JWS; OAuth2的实现如: Spring Security OAuth, OLTU.

更多信息可参考: http://openid.net/connect/

OIDC 1.0协议: http://openid.net/specs/openid-connect-core-1_0.html

拥抱OIDC…

openid-r-logo-900x360