3 分钟
单点登录
CAS
CAS整体流程
- 用户请求一个需要登录的页面或者接口例如
/user/info
- 服务端按照正常逻辑检查是否登录,若未登录
- 将302跳转到SSO服务端: https://sso_host/cas/login?service=http://{your_host}/login?jump=/user/info
- 浏览器访问SSO页面,登录成功后,SSO将302跳转到:http://{your_host}/login?ticket=ST-xxxxxxx-xxxxxxxxxxxxxxxxxxx&jump=/user/info 注意返回额外携带了一个ticket参数
- 浏览器访问服务端的登录页面后
- 登录处理器用到serviceValidat接口验证ticket并获取用户信息到 https://sso_host/cas/serviceValidate?service=http://{your_host}/test&ticket=ST-xxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- cookie或者其他登录凭证
- 302跳转到/user/info
- 浏览器设置cookie后,浏览器访问/user/info
- 服务端根据cookie或其他凭证判断用户已登录,返回信息
OAUTH2
OAUTH2整体流程
前置条件:在SSO上申请一个应用:需要填写如下信息:
- 应用的URL
- 应用的回调地址
redirect_uri
(需要校验) - 应用名称
申请成功后,会提供一个client_id和client_secret,在后续获取token时使用
- 用户请求一个需要登录的页面或者接口例如
/user/info
- 浏览器访问SSO页面,登录成功后,SSO将302跳转到redirect_uri:https://{your_base_url}/oauth/sso_callback?code=xxxxxxxxxxxxxxx&state=https://{your_base_url}/user/info 注意返回额外携带了一个code参数并将state也拼装到get参数中
- 浏览器访问服务端该URL后
- 服务端访问 https://sso_host/oauth2/access_token ,使用如下参数获取 token
client_id
client_secret
grant_type
需要填写authorization_codecode
上一步获得的 coderedirect_uri
:回调地址,需要与注册应用里的回调地址以及第一步的 redirect_uri 参数一致- 服务端访问 https://sso_host/oauth2/userinfo ,使用上一步获取的token获取用户信息
- 保存用户信息,并保存cookie或者其他登录凭证
- 302跳转到/user/info
- 浏览器设置cookie后,浏览器访问/user/info
- 服务端根据cookie或其他凭证判断用户已登录,返回信息
- 服务端根据cookie或其他凭证判断用户已登录,返回信息
TIPS
Spring Security 中,配置使用OAuth2后核心的处理类如下:
org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider#authenticate
Java Nginx转发需要的相关配置:
server.use-forward-headers=true
Flask Nginx负载均衡需要指定中间件
from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, settings.PROXIES_COUNT)
nginx配置了https后
location /path {
proxy_pass http://localhost:8000;
proxy_set_header Host $host; # 重要
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # 如果出问题后可以手动指定为https
proxy_set_header X-Real-HOST $host;
}