//资源和认证服务器不相同
http://xxxx:8080/flowAuth/oauth/authorize?client_id=jerry&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fAuthProvider%2ftest%2findex.do&response_type=code&scope=read
//资源和认证服务器相同
http://xxxx:8080/flowAuth/oauth/authorize?client_id=fuck&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fflowAuth%2ftest%2fcc.do&response_type=code&scope=read
http://xxxx:8080/flowAuth/oauth/authorize?client_id=fuck&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fflowAuth%2ftest%2findex.do&response_type=code&scope=read
//密码模式认证
http://xxxx:8080/flowAuth/oauth/authorize?username=Miki&password=123456&grant_type=password&scope=read&client_id=fuck&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fflowAuth%2ftest%2findex.do&response_type=code
//获取access_token
http://xxxx:8080/flowAuth/oauth/token?client_id=jerry&client_secret=1111&grant_type=authorization_code&code=FlmXb7&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fflowAuth%2ftest%2findex.do
{
"access_token":"3e85af06-245e-433f-a533-400dccba6b12",
"token_type":"bearer",
"refresh_token":"58f4dabb-8c54-4cdd-af36-b87d64eeda94",
"expires_in":43199,
"scope":"read"
}
获取access_token后访问资源 [POST]
http://xxxx:8080/flowAuth/test/index.do?access_token=cd105a0e-506f-4696-ab6c-0ad59afe3bfa
Authorities:资源
//刷新access_token
http://xxxx:8080/flowAuth/oauth/token?client_id=fuck&client_secret=2222&grant_type=refresh_token&refresh_token=4f6d41ba-7170-4160-84c9-e59c9210b304
第三方如你需要下载csdn上的资源,不想注册,那么可以调用qq oauth接口登录,此时,csdn是第三方客户端,qq是服务器,资源的提供端,调用qq ouath接口,服务器端创建token
和相应秘钥,将用户重定向到用户确认界面,询问是否确认授权,用户同意,重定向到第三方客户端,客户端用返回的token请求服务器端,获取access_token和秘钥,及用户信息。
<!--一个自定义的filter,必须包含 authenticationManager,accessDecisionManager,securityMetadataSource三个属性-->
客户端对象重要的属性有:
clientId:(必须)客户端id。
secret:(对于可信任的客户端是必须的)客户端的私密信息。
scope:客户端的作用域。如果scope未定义或者为空(默认值),则客户端作用域不受限制。
authorizedGrantTypes:授权给客户端使用的权限类型。默认值为空。
authorities:授权给客户端的权限(Spring普通的安全权限)。
OAuth的参与实体至少有如下三个:
· RO (resource owner): 资源所有者,对资源具有授权能力的人.
· RS (resource server): 资源服务器,它存储资源,并处理对资源的访问请求。
· Client: 第三方应用,它获得RO的授权后便可以去访问RO的资源。
此外,为了支持开放授权功能以及更好地描述开放授权协议,OAuth引入了第四个参与实体:
· AS (authorization server): 授权服务器,它认证RO的身份,为RO提供授权审批流程,并最终颁发授权令牌(Access Token)。
协议的基本流程如下:
(1) Client请求RO的授权,请求中一般包含:要访问的资源路径,操作类型,Client的身份等信息。
(2) RO批准授权,并将“授权证据”发送给Client。至于RO如何批准,这个是协议之外的事情。典型的做法是,AS提供授权审批界面,让RO显式批准。这个可以参考下一节实例化分析中的描述。
(3) Client向AS请求“访问令牌(Access Token)”。此时,Client需向AS提供RO的“授权证据”,以及Client自己身份的凭证。
(4) AS验证通过后,向Client返回“访问令牌”。访问令牌也有多种类型,若为bearer类型,那么谁持有访问令牌,谁就能访问资源。
(5) Client携带“访问令牌”访问RS上的资源。在令牌的有效期内,Client可以多次携带令牌去访问资源。
(6) RS验证令牌的有效性,比如是否伪造、是否越权、是否过期,验证通过后,才能提供服务。
授权码类型的开放授权协议流程描述如下:
(1) Client初始化协议的执行流程。首先通过HTTP 302来重定向RO用户代理到AS。Client在redirect_uri中应包含如下参数:client_id, scope (描述被访问的资源), redirect_uri (即Client的URI), state (用于抵制CSRF攻击). 此外,请求中还可以包含access_type和approval_prompt参数。当approval_prompt=force时,AS将提供交互 页面,要求RO必须显式地批准(或拒绝)Client的此次请求。如果没有approval_prompt参数,则默认为RO批准此次请求。当 access_type=offline时,AS将在颁发access_token时,同时还会颁发一个refresh_token。因为 access_token的有效期较短(如3600秒),为了优化协议执行流程,offline方式将允许Client直接持refresh_token 来换取一个新的access_token。
(2) AS认证RO身份,并提供页面供RO决定是否批准或拒绝Client的此次请求(当approval_prompt=force时)。
(3) 若请求被批准,AS使用步骤(1)中Client提供的redirect_uri重定向RO用户代理到Client。redirect_uri须包含 authorization_code,以及步骤1中Client提供的state。若请求被拒绝,AS将通过redirect_uri返回相应的错误信 息。
(4) Client拿authorization_code去访问AS以交换所需的access_token。Client请求信息中应包含用于认证Client身份所需的认证数据,以及上一步请求authorization_code时所用的redirect_uri。
(5) AS在收到authorization_code时需要验证Client的身份,并验证收到的redirect_uri与第3步请求authorization_code时所使用的redirect_uri相匹配。如果验证通过,AS将返回access_token,以及refresh_token(若access_type=offline)。
多个<intercept-url>元素为不同URL的集合定义不同的访问需求,它们会被归入一个有序队列中,每次取出最先匹配的一个元素使用。
一个http的配置对应一个资源,http可以配置一组action,http标签的url-pattern属性配置url资源,也可以使用通配
符配置一组资源
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />4
<user name="user" password="user" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
authorities属性,这里定义了这个用户登陆之后将会拥有的权限,它与上面intercept-url中定义的权限内容一一对
应。每个用户可以同时拥有多个权限
框架自己提供的URL路径是/oauth/authorize(授权端),/oauth/token (令牌端),/oauth/confirm_access (用户发送确认授权到这里),还有/oauth/error (用户呈现授权服务器授权出错的请求)。
authorizedGrantTypes:授权给客户端使用的权限类型。默认值为空。
token - tokenService
client - clientDetailService
user - userDetailsService
Spring Security已经定义了一些Filter,不管实际应用中你用到了哪些,它们应当保持如下顺序。
(1)ChannelProcessingFilter,如果你访问的channel错了,那首先就会在channel之间进行跳转,如http变为https。
(2)SecurityContextPersistenceFilter,这样的话在一开始进行request的时候就可以在SecurityContextHolder中建立一个SecurityContext,然后在请求结束的时候,任何对SecurityContext的改变都可以被copy到HttpSession。
(3)ConcurrentSessionFilter,因为它需要使用SecurityContextHolder的功能,而且更新对应session的最后更新时间,以及通过SessionRegistry获取当前的SessionInformation以检查当前的session是否已经过期,过期则会调用LogoutHandler。
(4)认证处理机制,如UsernamePasswordAuthenticationFilter,CasAuthenticationFilter,BasicAuthenticationFilter等,以至于SecurityContextHolder可以被更新为包含一个有效的Authentication请求。
(5)SecurityContextHolderAwareRequestFilter,它将会把HttpServletRequest封装成一个继承自HttpServletRequestWrapper的SecurityContextHolderAwareRequestWrapper,同时使用SecurityContext实现了HttpServletRequest中与安全相关的方法。
(6)JaasApiIntegrationFilter,如果SecurityContextHolder中拥有的Authentication是一个JaasAuthenticationToken,那么该Filter将使用包含在JaasAuthenticationToken中的Subject继续执行FilterChain。
(7)RememberMeAuthenticationFilter,如果之前的认证处理机制没有更新SecurityContextHolder,并且用户请求包含了一个Remember-Me对应的cookie,那么一个对应的Authentication将会设给SecurityContextHolder。
(8)AnonymousAuthenticationFilter,如果之前的认证机制都没有更新SecurityContextHolder拥有的Authentication,那么一个AnonymousAuthenticationToken将会设给SecurityContextHolder。
(9)ExceptionTransactionFilter,用于处理在FilterChain范围内抛出的AccessDeniedException和AuthenticationException,并把它们转换为对应的Http错误码返回或者对应的页面。
(10)FilterSecurityInterceptor,保护Web URI,并且在访问被拒绝时抛出异常。
引到用户到地址"oauth/authorize" 如果用户同意 跳转至回调uri+code=CODE
发起换取access_token的请求
1.获得授权码(code/token)
2.获取accesstoken
3.通过accesstoken,获取OpenID
4.通过OpenID和accesstoken调用API,获取获取用户信息
OAuth2.0中目前有四种授权类型:Authorization Code,implicit,password,client credentials
oauth2.0的基本流,
1.请求用户授权,
2.获取code,
3.获取token,
4.请求资源验证token.
因此,只需要关注
WebServerOAuth2Filter,
BasicUserApprovalFilter,
OAuth2AuthorizationFilter,
OAuth2ProtectedResourceFilter,
其中WebServerOAuth2Filter是/oauth/user/authorize入口,验证code无效,unapprovedAuthenticationHandler跳转到/oauth/confirm_access,用户提交之后 BasicUserApprovalFilter拦截之后,获取授权参数,就交给 WebServerOAuth2Filter获取code,获取code返回到client,然后client再次请求 /oauth/authorize,OAuth2AuthorizationFilter获取token,之后只要请求的时候带上token由 OAuth2ProtectedResourceFilter负责验证,是否可获取用户资源.
处理认证请求("/aouth/authorize")的类:AuthorizationEndpoint
标签 <authorization-server></authorization-server> 的属性名列表
authorization-code
implicit
refresh-token
client-credentials
password
custom-grant
client-details-service-ref
toen-endpoint-url
authorization-endpoint-url
token-granter-ref
token-services-ref
authorization-request-manager-ref
user-approval-handler-ref
user-approval-ref
error-page
approval-parameter-ref