全部产品
云市场

OAuth对接实践 - Windows应用

更新时间:2019-06-13 14:53:50

本章结合Demo代码,介绍单租户托管型应用免登及用户信息获取的相关流程。开发之前,请务必参考详细的对接专题文档。注:Demo代码见文章底部,基于NetFramework 4.5 AspNet MVC技术。

1 获取oauthcode

根据环境变量获取到的appkey与请求头获取跳转地址拼接鉴权url并访问该url。如下图:

  1. private static string appKey = Environment.GetEnvironmentVariable("IOT.HOSTING.APPKEY");
  2. [HttpGet]
  3. public ActionResult OAuthVerification()
  4. {
  5. redirectUrl = $@"http://{Request.Headers.Get("Host")}";
  6. var url = $"https://account.iot.aliyun.com/oauth2/auth?client_id={appKey}&redirect_uri={redirectUrl}&response_type=code";
  7. return new RedirectResult(url, false);
  8. }

鉴权url会连接到Iot平台进行相关验证,成功后会根据{ redirectUrl }中的地址进行跳转并携带code参数。该参数就是我们后续用到oauthcode参数。实际效果如下:

  1. http://47.102.253.36:9090/?code=b27baa5b367baf46d6625989cadc87e7

注意:这里的redirectUrl需要与你的应用入口地址保持一致,否则会报invalid.authCode无效错误。你的应用入口地址在应用托管后台-应用管理列表中可找到。如下:

image.png
另外,一般我们的应用入口是登陆页面与OAuth免登中的回调跳转地址共用一个地址,所以可以通过是否有code参数判断是否是OAuth回调跳转,原有的登陆页面也应该保留。

  1. public ActionResult Index(string code)
  2. {
  3. if (!string.IsNullOrWhiteSpace(code))
  4. {
  5. //如果有code参数,说明是登录iot平台验证成功并跳转到这里
  6. //实现免登逻辑放这里,比如:
  7. //1、根据GetUserInfoByAccessToken接口获取Iot用户信息并判断该用户在系统中对应的账号
  8. //2、使用随机或生成固定密码实现免登,或者生成一个一段时间内有效的签名sign实现免登
  9. currentAuthCode = code;
  10. return View("OAuthIndex");
  11. }
  12. return View();
  13. }

2 获取用户信息

在调用getUserInfoByAccessToken接口前,需要先调用getAccessTokenByAuthCode接口,根据oauthcode换取accesscode。调用getAccessTokenByAuthCode接口代码如下:

  1. [HttpPost]
  2. public string GetAccessCode(string path)
  3. {
  4. if (null != lastRequestResult)
  5. {
  6. //该接口只能调用一次,多次调用会失败,所以直接返回上次调用的结果。
  7. return JsonConvert.SerializeObject(lastRequestResult);
  8. }
  9. var @params = new
  10. {
  11. //currentAuthCode即刚获取到oauthcode
  12. @code = currentAuthCode,
  13. redirect_uri = redirectUrl,
  14. client_id = appKey,
  15. grant_type = "authorization_code"
  16. };
  17. //path为接口调用路径
  18. var responseStr = SendRequest(path, @params, new { apiVer = "1.0.1" });
  19. lastRequestResult = JsonConvert.DeserializeObject<OAuthResult<GetAccessCodeResult>>(responseStr);
  20. return responseStr;
  21. }

之后根据已获得的accesscode调用getUserInfoByAccessToken接口,获取Iot平台用户信息(包含用户手机号、用户明、openId等),接口调用代码如下:

  1. [HttpPost]
  2. public string GetUserInfoByAccessToken(string path)
  3. {
  4. var responseStr = SendRequest(path, new { lastRequestResult.data.access_token }, new { apiVer = "1.0.2" });
  5. return responseStr;
  6. }

3 实现免登

至此,我们拿到了Iot平台用户的相关信息,在系统应用中就可以判断该用户是否存在,是否是第一次登入系统等;来实现免登逻辑:
a、如果用户是首次登陆,则可以根据获取到的Iot用户信息在系统内创建账号密码与初始化账户相关的信息。
b、如果用户是首次登陆且需要收集用户额外的信息,比如所属企业信息,还可以展示一个收集信息的页面,收集信息后再创建用户账户信息。
c、如果用户是首次登陆,可以创建随机的,让用户登入系统后提示其再修改密码。也可以计算一个一段时间内有效的sign签名实现免登。

4 示例Demo

下载地址:OAuth Demo for Windows