跳到主要内容

自定义接口配置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=

参数:

参数格式是否必填含义备注
domainstring必传企业域企业域名
statestring选传内嵌参数内嵌参数
redirectstring选传重定向url如果需要跳转的不是配置中的idp,可以通过传入urlencode的url地址数据,当命中可信域名配置时,即可跳转至redirect地址
forceint选传是否强制登录可不校验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原始jsonstring选传
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