grant_type=authorization_code 中 redirect_uri的代码实现参考

OAuth2中grant_type=authorization_code时, 需要填写redirect_uri, 而该uri将如何处理与实现呢, 在此提供具体的讲解与实现参考

redirect_uri在注册ClientDetails时需要提供(当grant_type包含authorization_code时), 且在发起OAUTH2流程时需要在参数中传递redirec_uri, 这两处的值必须一致.

 

在业务中, redirect_uri代码实现主要用于接收返回的code值, 校验state是否合法, 以及通过code换取accessToken操作.

在 spring-oauth-client 项目的 AuthorizationCodeController.java 类中, authorization_code_callback 方法实现了以上的逻辑, 在具体实现是可参考该方法的实现, 代码如下:

@RequestMapping(value = "authorization_code_callback")
public String authorizationCodeCallback(AuthCallbackDto callbackDto, HttpServletRequest request, Model model) throws Exception {

    if (callbackDto.error()) {
        //Server response error
        model.addAttribute("message", callbackDto.getError_description());
        model.addAttribute("error", callbackDto.getError());
        return "redirect:oauth_error";
    } else if (correctState(callbackDto, request)) {
        //Go to retrieve access_token form
        AuthAccessTokenDto accessTokenDto = oauthService.createAuthAccessTokenDto(callbackDto);
        model.addAttribute("accessTokenDto", accessTokenDto);
        model.addAttribute("host", host);
        return "code_access_token";
    } else {
        //illegal state
        model.addAttribute("message", "Illegal \"state\": " + callbackDto.getState());
        model.addAttribute("error", "Invalid state");
        return "redirect:oauth_error";
    }

}

 

这里实现首先检查服务端是否返回error信息,

然后判断state是否正确, 若正确则显示一个页面, 并在code_access_token方法中(同一个类中)使用 httpclient 发起请求(grant_type=authorization_code)通过 code换取access_token.

其它情况则显示error信息.

 

http://git.oschina.net/mkk/spring-oauth-client

spring-oauth-server中添加 resource 的配置

resource,资源, resource-id资源ID, 在spring-oauth-server中添加 client details时有两个resource可以选择(mobile-resource, unity-resource); 这些resource-id从哪来的呢? 如果我需要添加自己的resource将如何办呢, 请继续向下看.

resource用于将系统提供的各类资源进行分组管理,每一个resource对应一个resource-id, 而一个client details至少要有一个resource-id(对应OauthClientDetails.java中的resourceIds字段).

在spring-oauth-server的security.xml配置文件的70行左右, 你会看到两行配置,如下:

<!--unity resource server filter-->
<oauth2:resource-server id="unityResourceServer" resource-id="unity-resource" token-services-ref="tokenServices"/>

<!--mobile resource server filter-->
<oauth2:resource-server id="mobileResourceServer" resource-id="mobile-resource" token-services-ref="tokenServices"/>

这儿就是配置resource的地方, 看见里面的两个resource-id值.

在这配置往上, 能看见两个<http>的配置, 一个的pattern为/m/**, 另一个为/unity/**, 这就是资源与Spring Security整合后的配置, 注意每个<http>配置里的 ROLE_UNITY与ROLE_MOBILE, 这对应Spring Security的权限; 截图如下:

resource-config

有了以上基础, 及下看我们要添加一个自己的resource, 假设resource-id = myResource, url pattern为/my/api/**, 权限为ROLE_MY_RESOURCE, scope为 read; 其配置如下:

1.添加<oauth2:resource-server> , resource-id=myResource, 如下:

<oauth2:resource-server id="myResourceServer" resource-id="myResource" token-services-ref="tokenServices"/>

注意, id值需要唯一
2.添加<http>配置, 如下:

<http pattern="/my/api/**" create-session="never" entry-point-ref="oauth2AuthenticationEntryPoint"
      access-decision-manager-ref="oauth2AccessDecisionManager" use-expressions="false">
    <anonymous enabled="false"/>

    <intercept-url pattern="/my/api/**" access="ROLE_MY_RESOURCE,SCOPE_READ"/>

    <custom-filter ref="myResourceServer" before="PRE_AUTH_FILTER"/>
    <access-denied-handler ref="oauth2AccessDeniedHandler"/>
    <csrf disabled="true"/>
</http>

说明: 一个<resource-server>可以配置多个<http>, 使用不同的url pattern

OK, 配置完成, 新增resource: myResource; 这时候, 所有以/my/api/** 开头的URL请求都将受到 OAUTH2的保护, 及下来在业务中创建client details, 记得把resourceIds设置为myResource,且要有ROLE_MY_RESOURCE的权限.

 

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连接,保证网络传输安全.

现在进行时。。。。

在这个夜晚。。。我在写下我的心情。。。一个好好的心情。。。。

我为了看足球比赛我来上夜机。。。

喜欢。不想去找太多的借口来说明。。的。。。

我看我的。。我写我的。。我做我喜欢做的。。。。呵呵。。。。

这就是我喽。。。憨笑

 

A0914094GE

 

2007-05-03 02:36:19

这是个大学

这个大学是这个样子的。。。

我们天天在不知道做什么之中度过。。

也许现在对我们来说都觉得这种生活很是无味。。无味的要命。。乏味。。。。。足球这个我喜欢。。

A6159853ME

 

2007-05-06 09:49:30

日子

好不容易找到了一部喜欢有电影了,高兴喽;好不容易有了一个好朋友了,如何就轻言说不要了呢.
哎,还在玩小孩子的脾气.
每天,单调,除了单调,也就只有单调 了,与书一起混日子,不知道何时是终点站.看足球比赛的
夜晚,永远值得留恋,虽说有几分的睡意,有何妨呢?呵呵,谁叫我喜欢呢>哎.于是,日子就弄来调过了,白天是睡觉,晚上是白天--有精神的很喽,嘻嘻....
也许我们是学会了太多的放弃,所以没了一个叫坚持的东西了.什么都是在说无所谓,无所谓,,,这似乎变的就像我们天天都要吃饭那样一般般化了...结果,结果是我们,我们就这样--当一天和尚撞一天钟,直到N天以后...
很难认清楚一个别人.也难以了解自己很清楚.许多难以说的话,其实是装饰自己的很好很好的东西,只是连自己个儿也不太想去承认罢了.-----自欺欺人!说白了.
没有错与不错之分的,只有,只看你去做不做之区.说错与不错,是自己从脑子里蹦出来的,从嘴里冒出来的污染空气的一次声嘶力竭的东西罢了,然后,啥也没有了
日子,就是故事.一个故事.一个一个人的故事.

2007-07-05 23:20:27

一篇日记

今天…3月11日,火箭又取得了一场胜利,,已经是第19场胜利了,早已写进NBA的历史了,,早上舍友就没去上课,在宿舍用我的电脑看比赛了.本来我也想不去上课的..结果还是去上了,,想想看了比赛还是看了,有什么的呢..是去上课也没多大的意思的的.可不去又像有点什么不详的感觉似的…

以前都是用一个NOTEBOOK来写日子的,一共写有好多个哦.都太记不清喽.呵呵,现在用电脑了,升级了哈!这个月初和第一天就去把这个电脑弄回来放在宿舍里了,,花了二千多,爹妈给的钱,我们都还在花父母的钱哈,,都是”奔三”的一代了,偶尔回去看看以前的同学,朋友,有很多的都成家了,有小孩子的也不少呢,,也许是读书让我如此大了还这样吧,不然和他们也差不多吧,或许喽….

大三的下学期,是这样的,八门功课,五门考试课,别的就是考查喽,想去报一个程序员的班学点专业的知识,不然,再过一年,等到我们毕业时,还真不知道啥办,,学点一技之长,我是这样认为的.那些很很多多的理想也会回归世界,慢慢地来吧..

想想和他们比起来.我真是一穷二白呢..还没过四级,计算机就别说了,其他的就更不用说了,两年多的大学生活中,我认识了很多的人,有的是好朋友,我的是朋友,我的是同学,还有的我也说不太清楚是个啥样喽..帮过同学考试过,和一群踢球的人呆在一起是很快乐的时光的.那些日子,那些球,那些人.

我想的是.我得每天练习打字,打字,我想把字打的很快很快的,,拼音太差哪.只能用五笔,,我的计划是每天花一个小时来练习.前天从图书馆里那出来一本OFFICE的书,有个朋友看了还笑笑呢.也许他觉得学这个太……可真不知道WORD EXCEL我们都懂得了多少..

学点实用的运用软件吧.OFFICE是第一个,还有Photoshop Dreamweavr Firework等等,,希望都能做到,那个JAVA程序也是要学的,只是我希望有点基础了再去学,因为我认为那样会更好.所有一切,,是我有了电脑.虽然有的说都大三了,没多大的用处了,可我想我是不和他们去解释的.

我的专业是让我那个证书的,证明我是一个合格的大学本科生,而我也明白我在管理等方面是不太行的,我想的就是我要有一门比较拿手的技术.

3月2号吧.我给王二哥寄了一个MP3和一件衣服,那个MP3是上天给我的,而那件衣服是她送的,可我穿的有点小,而我和她已经......所以那衣服我就不想看见喽,且那衣服还不错,就这样呗...

很多时候,,还是去听听课

明天的凌晨,欧冠1/8最后的一个名额就要产生了.是利物浦还是国米??

2008-3-11

 

http://blog.renren.com/blog/223436424/275693624

刘春翼,你还在吗?

刘春翼, 你还在吗? 我不知道为什么,问了一句.

时间已经过去了很久.. 很久..

曾经,是的,你很失败,远离一群曾曾经的人,至此消失,至少对于我,是如此,是如此认为.

 

刘春翼,看这段话

************
十二码是段残忍的距离,我们在那里永远看不到希望。
于是我依然会半夜突然醒来,依然。
一心想成为李寻欢似的人,现在才发现自己或许更像阿飞。

***********************************
欲将心事付瑶琴,知者少,弦断有谁听?

           ——后来,我怎舍得改变?

不知翻看此文, 竟有此感. 也不知道,你曾是否改变,或舍得改变…

 

刘春翼, 你还在吗? 不用再去搬看那些事,那些钱,那些恶,那些话,那些天,那些光阴…

曾经的过往早已成为过往,只是早已消失的无有踪影,

记忆越来越模糊,无以回顾…

 

刘春翼,你还在吗? 存在于哪一个世界的角落.

只希望,最后的.

至少,我没把你名字也打错了吧!?

 

说的过别人,说的过一群人,说的过任何人,

或许早已淡然,无以慰祭.

永远”遗世十二码“.

 

 

Three