最近將 Chatbot 透過 Webchat 的方式給公司同仁使用,在使用之前都需要透過登入可以使用請假或是訂會議室的功能。
其中有一位同事就是登入不進去,但是其他人卻沒有這個問題。於是看錯誤訊息,的確是密碼驗證不過。再詢問他的密碼是否有特別的字元,他回答其中有 “&" 這個字。
再看一下同事 Alice 寫的程式中,透過 HttpClient 去 Post 資料時,使用的是 StringContent ,將各別的欄位透過 & 去串接,內容如下,
var userInfo = "grant_type=password&username=" + usrname + "&password=" + pwd;
var postContent = new StringContent(userInfo);
var response = client.PostAsync(tokenUrl, postContent).Result;
謎題解開了,因為密碼中有 & ,而程式碼又沒加以 Encode ,所以就造成了密碼錯誤的問題。
解法就是 Encode ,
1.使用 UrlEncode 去包每個參數,如下,
var userInfo = "grant_type=password&username=" + HttpUtility.UrlEncode(usrname) + "&password=" + HttpUtility.UrlEncode(pwd);
var postContent = new StringContent(userInfo);
var response = client.PostAsync(tokenUrl, postContent).Result;
2.使用 FormUrlEncodedContent ,這樣裡面的值,它會幫我們 Encode ,如下,
var formContent = new FormUrlEncodedContent(new[]
{
new KeyValuePair("grant_type", "password"),
new KeyValuePair("username", usrname),
new KeyValuePair("password", pwd)
});
var response = client.PostAsync(tokenUrl, formContent).Result;
註: PostAsync , ReadAsStringAsync 您也可以使用 async/await 方式哦!