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无效错误。你的应用入口地址在应用托管后台-应用管理列表中可找到。如下:

image.png另外,一般我们的应用入口是登录页面与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签名实现免登。

4 示例Demo

下载地址:OAuth Demo for Windows