OAuth对接实践 - Windows应用
本章结合Demo代码,介绍单租户托管型应用免登及用户信息获取的相关流程。开发之前,请务必参考详细的对接专题文档。注:Demo代码见文章底部,基于NetFramework 4.5 AspNet MVC技术。
1 获取oauthcode
根据环境变量获取到的appkey与请求头获取跳转地址拼接鉴权URL并访问该URL。如下图:
private static string appKey = Environment.GetEnvironmentVariable("IOT.HOSTING.APPKEY");
[HttpGet]
public ActionResult OAuthVerification()
{
redirectUrl = $@"http://{Request.Headers.Get("Host")}";
var url = $"https://account.iot.aliyun.com/oauth2/auth?client_id={appKey}&redirect_uri={redirectUrl}&response_type=code";
return new RedirectResult(url, false);
}
鉴权URL会连接到Iot平台进行相关验证,成功后会根据{ redirectUrl }中的地址进行跳转并携带code参数。该参数就是我们后续用到oauthcode参数。实际效果如下:
http://47.102.253.36:9090/?code=b27baa5b367baf46d6625989cadc87e7
注意:这里的redirectUrl需要与你的应用入口地址保持一致,否则会报invalid.authCode无效错误。你的应用入口地址在应用托管后台-应用管理列表中可找到。如下:
另外,一般我们的应用入口是登录页面与OAuth免登中的回调跳转地址共用一个地址,所以可以通过是否有code参数判断是否是OAuth回调跳转,原有的登录页面也应该保留。
public ActionResult Index(string code)
{
if (!string.IsNullOrWhiteSpace(code))
{
//如果有code参数,说明是登录iot平台验证成功并跳转到这里
//实现免登逻辑放这里,比如:
//1、根据GetUserInfoByAccessToken接口获取Iot用户信息并判断该用户在系统中对应的账号
//2、使用随机或生成固定密码实现免登,或者生成一个一段时间内有效的签名sign实现免登
currentAuthCode = code;
return View("OAuthIndex");
}
return View();
}
2 获取用户信息
在调用getUserInfoByAccessToken接口前,需要先调用getAccessTokenByAuthCode接口,根据oauthcode换取accesscode。调用getAccessTokenByAuthCode接口代码如下:
[HttpPost]
public string GetAccessCode(string path)
{
if (null != lastRequestResult)
{
//该接口只能调用一次,多次调用会失败,所以直接返回上次调用的结果。
return JsonConvert.SerializeObject(lastRequestResult);
}
var @params = new
{
//currentAuthCode即刚获取到oauthcode
@code = currentAuthCode,
redirect_uri = redirectUrl,
client_id = appKey,
grant_type = "authorization_code"
};
//path为接口调用路径
var responseStr = SendRequest(path, @params, new { apiVer = "1.0.1" });
lastRequestResult = JsonConvert.DeserializeObject<OAuthResult<GetAccessCodeResult>>(responseStr);
return responseStr;
}
之后根据已获得的accesscode调用getUserInfoByAccessToken接口,获取Iot平台用户信息(包含用户手机号、用户明、openId等),接口调用代码如下:
[HttpPost]
public string GetUserInfoByAccessToken(string path)
{
var responseStr = SendRequest(path, new { lastRequestResult.data.access_token }, new { apiVer = "1.0.2" });
return responseStr;
}
3 实现免登
至此,我们拿到了Iot平台用户的相关信息,在系统应用中就可以判断该用户是否存在,是否是第一次登入系统等;来实现免登逻辑:a、如果用户是首次登录,则可以根据获取到的Iot用户信息在系统内创建账号密码与初始化账户相关的信息。b、如果用户是首次登录且需要收集用户额外的信息,比如所属企业信息,还可以展示一个收集信息的页面,收集信息后再创建用户账户信息。c、如果用户是首次登录,可以创建随机的,让用户登入系统后提示其再修改密码。也可以计算一个一段时间内有效的sign签名实现免登。