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簽名實現免登。