自定义接口配置v2
完整流程图
配置
整体配置和旧版自定义配置保持一致,需要pub_key以及配置加密方式。
IDP信息
自定义配置只需要提供统一登录和登出两个接口,接口需要按照的接口开发的要求接收参数和返回结果值。登录接口用于接收ticket参数,提供用户登录并重定向回BDP的能力。登出接口则在登出BDP时,会重定向回用户认证体系并在客户端(浏览器)完成登出。
如果暂无接口,如需要重新开发接口,请先任意填写两个接口,完成配置才能获取到加密证书。
匹配用户信息
同旧版自定义单点登录不同,新版自定义单点登录关闭了此项配置,并且要求统一按照下面的JSON格式加密用户信息。
{"username": ""}
可信域名配置
新版支持灵活对接多个IDP认证体系,如果用户存在多个IDP,且都需要与BDP对接,可以把需要redirect的地址提供给BDP认证端,BDP认证端会校验符合可信域名配置才会签发一次性ticket。
登出配置
对应IDP配置中的登出接口,可选择开启关闭。
加密方式
支持两种加密或者证书认证方式:RSA与自定义MD5。
SP信息
其中pub_key是全部加密方式的公钥,也是认证中需要附带到sign中的,而其他的sso、slo、acs信息等暂时和新的方案无关。
流程
前提
开发者必须提供IDP登录验证(idp_login)接口,接收由BDP签发的一次性ticket。即下述流程中,校验用户在IDP(通常为企业内部账号中心)登录状态功能由开发者提供,而BDP提供认证后的信息交互和登录的能力。
登录
1. RSA方式对接单点登录
1) 用户通过内部系统访问BDP,调用BDP提供的SSO auth接口,传入domain
2) SSO auth接口判断登录是否过期,如果登录已过期,回调(302重定向跳转)用户配置的idp_login接口,跳转后登录校验由IDP验证完成
3) IDP完成登录后,获取到对应的BDP用户,并对BDP的username和ticket进行RSA加密,携带密文(user_info)和domain重定向回调 BDP valid_auth 接口
4) BDP SSO valid_auth 解密验证用户信息,成功后登录BDP主站
2. 自定义MD5对接单点登录
1) 用户通过内部系统访问BDP,调用BDP提供的SSO auth接口,传入domain
2) SSO auth接口判断登录是否过期,如果登录已过期,回调(302重定向跳转)用户配置的idp_login接口,跳转后登录校验由IDP验证完成
3) IDP完成登录后,获取到对应的BDP用户,并对BDP的username和ticket进行MD5签名,携带签名sign(user_info)和原始json串(real_info)和domain重定向回调BDP valid_auth 接口
4) BDP SSO valid_auth通过密钥验证签名和用户信息,成功后登录BDP主站
接口开发
1. BDP SSO auth接口
地址: https://www.bdp.cn/api/sso/auth?domain=
参数:
参数 | 格式 | 是否必填 | 含义 | 备注 |
---|---|---|---|---|
domain | string | 必传 | 企业域 | 企业域名 |
state | string | 选传 | 内嵌参数 | 内嵌参数 |
redirect | string | 选传 | 重定向url | 如果需要跳转的不是配置中的idp,可以通过传入urlencode的url地址数据,当命中可信域名配置时,即可跳转至redirect地址 |
force | int | 选传 | 是否强制登录 | 可不校验BDP当前的登录有效期,直接进行IDP验证 |
跳转地址:
idp_login?state=
2. BDP SSO valid_auth接口
地址: https://www.bdp.cn/api/sso/valid_auth?domain=&user_info=
参数:
参数 | 含义 | 格式 | 是否必填 | 备注 |
---|---|---|---|---|
domain | 企业域 | string | 必传 | 企业域名 |
user_info | 密文或者签名 | string | 必传 | user_info为密文或签名,取决于配置的方式,加密的原文为json |
real_info | 原始json | string | 选传 | |
state | 内嵌参数 | string | 选传 | 内嵌参数 |
RSA加密方式
基于pub_key加密的原文json字符串格式如下,其中ticket为第一步BDP签发
{"username": "", "ticket": ""}
加密后得到的密文进行base64编码,即可赋值给user_info
MD5签名方式
基于pub_key的签名原文json字符串以及方式如下:
原始json串:{"username": "", "ticket": ""}
加密字符串的内容:username + ticket + pub_key.replace("\n", "")
对加密字符串进行MD5加密后,得到密文即可赋值给user_info。对原始json串进行json格式化,即可赋值给real_info
加密处理demo
Python——RSA的Base64加密接口示例:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import rsa
import json
import base64
from urllib import urlencode
pub_str = '''-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAIv7BNJT2ET7TVB1iYrxm4AdCf7xXoixFq38MdlL/W4l3Z5E+6Slo3Wu
9tXv9jQtfr0aHLTzMD3oxuBKKJ20IGx4KzdvlVZfkrutyc2pOen9L5CrnKXLbSdr
j7cGcZx2FBeBI9OvFmBBwig+NTgR/ybyMh5fwrnhENHwXPIOb62NAgMBAAE=
-----END RSA PUBLIC KEY-----
'''
user_info = {"username": "BDP_USER", "ticket": "ticket_123456"}
user_info_str = json.dumps(user_info)
pub_key = rsa.PublicKey.load_pkcs1(pub_str)
cry = base64.encodestring(rsa.encrypt(user_info_str,pub_key ))
print cry
payload = urlencode({"user_info": cry})
print payload
Python——自定义加密(MD5)接口示例:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import md5
from urllib import urlencode
import json
def get_token(username, ticket, pub_key):
m1 = md5.new()
m1.update(username + ticket + pub_key.replace("\n", ""))
return m1.hexdigest()
pub_key = '''-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAMr0CpVULys1pMkugjXvCSsSsX0CvpGxVQVgB/JFuOUHTTHErzOVbw8H
09e0l/IIG4jz2A1UydC4wXZCsLK6Wg5UdlfbBMhavmvHTwqsXSWxvAl5pi0r52G3
sBYGQ4q4Uo/cZC2BAl22fSaY1nKVxGaQLOinRaR34HDXM967hWNlAgMBAAE=
-----END RSA PUBLIC KEY-----
'''
user_info = {"username": "BDP_USER", "ticket": "ticket_123456"}
token = get_token(user_info['username'], user_info['ticket'], pub_key)
payload = urlencode({"real_info": json.dumps(user_info), "user_info": token, "domain": "domain"})
print payload