BBScloud授权登录第三方应用
如果希望利用BBScloud授权登录您的其他应用,请创建OAUTH客户端,基于OAUTH2.0协议引导BBScloud向其他网站授权。
创建OAuth客户端
名词解释
1 应用名称
您可以设置您的应用名称,这将会显示在您的应用请求授权的页面上;
2 安全域名
在这里需要您设置可用的安全回调域名;授权前我们会验证您的域名是否合法;只有配置安全域名才能够回调成功。域名不需要要包含https://或http,我们推荐使用配置具备ssl证书的域名。
示例: www.bbscloud.com
配置成功
配置成功后您将获取到 app_id 和 app_secret;请妥善保管您的密钥。它将成为您访问的必要验证参数。
对接OAuth客户端
请求url地址,如果您使用的是创建站点是分配的域名或修改的二级域名,例如 1000001.bbscloud.com或b.bbscloud.com,在请求的时候请求url对应的就是上面的地址,如果您使用的是您自己的域名,请求地址就是* https://youdomain.com*,示例 https://bbs.jielingguanjian.com
1 获取Authorization Code
1.1 请求描述
- 请求方式:post
- 请求地址:/api/sso/oauth_code
- 编码格式: application/json
参数名称 | 参数类型 | 是否必填 | 备注 |
---|---|---|---|
client_id | String | 是 | 配置OAuth时分配的app_id |
client_secret | String | 是 | 配置OAuth时分配的app_secret |
response_type | String | 是 | 固定值code |
1.2 返回结果描述
字段名 | 字段类型 | 备注 |
---|---|---|
type | int | 请求返回值,正常情况会返回1 |
data | String | code值,返回状态为1时会给您返回code |
description | String | 描述文字,当type不为1时我们会返回对应的错误信息 |
1.3 返回结果示例
{
"type": 1,
"data": "3b9997523f7a49e8ae5811c6dc1efdd5",
"description" : ""
}
2 登录授权
根据获取到的code您可以拼接授权访问链接,并跳转至这个地址,示例:
/loginAuth?client_id=[YOUR_APPID]&response_type=code&code=[code}&redirect_uri=[YOUR_REDIRECT_URI]&state=hello
如果用户已经有登录态,会出现一个确认页。如果还没有登录,会先进行登录,如下图所示:
如果用户点击“授权并登录”,则成功跳转到指定的redirect_uri,并跟上Authorization Token(注意此token会在5分钟内过期)。
例如回调地址是:www.bbscloud.com/callback,则会跳转到:
https://www.bbscloud.com/callback?token=520DD95263C1CFEA0870FBB66E******
3 根据Token获取用户信息
1.1 请求描述
- 请求方式:get
- 请求地址:/api/sso/userInfo
- 编码格式: multipart/form-data
参数名称 | 参数类型 | 是否必填 | 备注 |
---|---|---|---|
access_token | String | 是 | 通过callback得到的token |
1.2 返回结果描述
字段名 | 字段类型 | 备注 |
---|---|---|
id | String | 用户Id |
userName | String | 用户名 |
accountEmail | String | 用户邮箱(可能为空) |
accountMobile | String | 用户手机号 |
error | String | 错误码,正常返回 0 |
error_description | String | 错误描述 |
1.3 返回结果示例
{
"error" : 0,
"id" : 'c306ffce817b495684db86b0993462cd',
"userName" : "张三",
"accountEmail" : "aaa@zzz.com",
"accountMobile" : "18888888888",
"avatar" : "377609792979603456.png"
}
1.4 错误码对应关系
错误码 | 描述 | 解决方案 |
---|---|---|
-1 | 授权版本过低,不允许三方登录 | 升级到专业及以上版本 |
-2 | 调用接口凭证无效 | access_token已过期,重新发起登录授权 |
-3 | 用户不存在 |
示例代码.net
/// <summary>
/// 跳转到站点授权页获取授权信息
/// </summary>
/// <returns></returns>
[AllowAnonymous]
public ActionResult LoginAuth()
{
var code = GetAuthorizationCode();
if (string.IsNullOrEmpty(code))
{
return Redirect("/");
}
return Redirect($"{domain}/loginAuth?client_id={appId}&response_type=code&code={code}&redirect_uri=http://192.168.0.140/account/callback&state=hello");
}
/// <summary>
/// 获取AuthorizationCode
/// </summary>
/// <returns></returns>
private string GetAuthorizationCode()
{
HttpClientHandler handler = new HttpClientHandler();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
using (HttpClient client = new HttpClient(handler))
{
client.BaseAddress = new Uri($"{domain}");
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36");
client.DefaultRequestHeaders.Add("Accept", "*/*");
var param = new AuthorizationCodeRequest
{
client_id = appId,
client_secret = appsecret,
response_type = "code"
};
var jsonData = JsonConvert.SerializeObject(param);
var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
var response = client.PostAsync("/api/sso/oauth_code", content).Result;
response.EnsureSuccessStatusCode();
string resultString = response.Content.ReadAsStringAsync().Result;
var result = JsonHelper.JsonToEntity<AuthorizationCodeResponse>(resultString);
return result.data;
}
}
暂无数据