基于spring4和spring security实现oauth2.0教程(注解)

1、OAuth是什么?    git

    OAuth的英文全称是Open Authorization,它是一种开放受权协议。OAuth目前共有2个版本,2007年12月的1.0版(以后有一个修正版1.0a)和2010年4月的2.0版,1.0版本存在严重安全漏洞,而2.0版解决了该问题。web

2、OAuth2.0有什么用?    spring

    引用一下OAuth2.0中文文档中的介绍:  json

    1.须要第三方应用存储资源全部者的凭据,以供未来使用,一般是明文密码。    api

    2.须要服务器支持密码身份认证,尽管密码认证天生就有安全缺陷。    浏览器

    3.第三方应用得到的资源全部者的受保护资源的访问权限过于宽泛,从而致使资源全部者失去对资源使用时限或使用范围的控制。    安全

    4.资源全部者不能仅撤销某个第三方的访问权限而不影响其它,而且,资源全部者只有经过改变第三方的密码,才能单独撤销这第三方的访问权限。  服务器

    5.与任何第三方应用的让步致使对终端用户的密码及该密码所保护的全部数据的让步。微信

    简单归纳,就是用于第三方在用户受权下调取平台对外开放接口获取用户相关信息。  app

    OAuth引入了一个受权环节来解决上述问题。第三方应用请求访问受保护资源时,资源服务器在获准资源用户受权后,会向第三方应用颁发一个访问令牌(AccessToken)。该访问令牌包含资源用户的受权访问范围、受权有效期等关键属性。第三方应用在后续资源访问过程当中须要一直持有该令牌,直到用户主动结束该次受权或者令牌自动过时。

3、OAuth2.0有哪几种受权模式?    

    受权码模式(Authorization Code)(正统方式)(支持refresh token)

    受权码简化模式(Implicit)(为web浏览器设计)(不支持refresh token)    

    Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)    

    Client模式(Client Credentials) (为后台api调用设计)(不支持refresh token)

1.受权码模式 (Authorization Code)(用户、第三方、受权方)

    

具体流程:

        一、用户利用受权方(QQ、微信、微博)登录第三方app(滴滴打车、云打印)

        二、第三方app须要提早访问受权方接口,向用户提供受权的页面

        三、用户在受权页面进行是否受权操做

        四、用户将受权信息提交给受权方

        五、第三方接收到用户的access_token

具体的流程图

受权方提供的接口:

    (第一步)http://localhost:8080/securitydemo/oauth/authorize?response_type=code&client_id=bizhanlu&state=userId&redirect_uri=http://www.baidu.com

    参数解析:response_type:指受权类型,必选,这里填固定值‘code’

         client_id:指客户端id,必选,这里填在平台报备时获取的appid

         redirect_uri:指重定向URI,可选

         scope:指申请的权限范围,可选

         state:指客户端当前状态,可选,若填了,则认证服务器会原样返回该值

        重定向到oauth/confirm_access页面,让用户进行受权操做后跳到回调地址,如https://www.baidu.com/?code=hvhj8k&state=userId

        经过code的值用POST访问下列接口获取访问access_token。

        (第二步)http://localhost:8080/iportalSecurity/oauth/token?client_id=bizhanlu&secret_id=111&grant_type=authorization_code&code=hvhj8k&redirect_uri=http://www.baidu.com

        client_id:指客户端id,必选,这里填在平台报备时获取的appid

        secret_id:指客户端密钥,必选,这里填在平台报备时获取的appsecret

        authorization_code:此模式值必须为authorization_code,必选

        code:oauth/authorize接口经过回调地址返回的code值,必选

        redirect_uri:指重定向URI,可选

        scope:指申请的权限范围,可选

        state:指客户端当前状态,可选,若填了,则认证服务器会原样返回该值

        返回json:{
                            "access_token": "675905e9-a6e1-43ec-b1d1-9de418713a83",
                             "token_type": "bearer",
                            "refresh_token": "98183ef5-5222-4d31-9907-f1b42fa13718",
                            "expires_in": 43032,
                            "scope": "A B C"
                        }

        (第三步)第三方就可使用access_token访问用户接口获取某些信息了。

2、 受权码简化模式(Implicit)(为web浏览器设计)

    此模式简化了受权码模式中的第二步,也就是省略了code,直接经过第一步调用后,经过回调地址返回access_token

    (第一步)http://localhost:8080/securitydemo/oauth/authorize?response_type=token&client_id=bizhanlu&state=userId&redirect_uri=http://www.baidu.com

    重定向到oauth/confirm_access页面,让用户进行受权操做后跳到回调地址 :https://www.baidu.com/#access_token=675905e9-a6e1-43ec-b1d1-9de418713a83&token_type=bearer&state=userId&expires_in=41700&scope=A%20B%20C

    (第二步)第三方就可使用access_token访问用户接口获取某些信息了。

3、 Pwd模式(Resource Owner Password Credentials)

(第一步)POST方式访问:http://localhost:8080/securitydemo/oauth/token?grant_type=password&username=bizhanlu&password=123

返回json:{
                            "access_token": "675905e9-a6e1-43ec-b1d1-9de418713a83",
                             "token_type": "bearer",
                            "refresh_token": "98183ef5-5222-4d31-9907-f1b42fa13718",
                            "expires_in": 43032,
                            "scope": "A B C"
                        }

就简单获取access_token

(第二步)第三方就可使用access_token访问用户接口获取某些信息了。

第四种暂时不讲了。

关于oauth2.0的总结就这些了,有什么问题能够留言,或者联系微信/QQ:993009844。项目源码

相关文章
相关标签/搜索