華為帳號服務學習筆記(四):Authorization Code模式服務端開發
筆者在《華為帳號服務學習筆記(二):OAuth2.0 協議詳解》中已經給大家介紹了Authorization Code 模式是需要有後臺伺服器才能使用的,並且在《華為帳號服務學習筆記(三):10 分鐘完成Authorization Code 模式客戶端Demo 開發》文章中已經給大家介紹了一種高效完成客戶端Demo 開發的方式,本篇文章將介紹code 模式服務端需要的開發步驟及注意事項,在介紹之前,筆者再帶大家先回顧下Code 模式整體的互動流程是怎樣的,華為帳號服務在使用code 模式時流程有哪些差異。
華為帳號服務Authorization Code 模式業務流程
步驟詳細介紹:
1. 使用者選擇帳號登入方式登入應用客戶端。
2. 應用客戶端向帳號SDK 傳送請求,獲取Authorization Code 。
3. 帳號SDK 向HMS Core (APK )傳送請求,獲取Authorization Code 。
4. HMS Core (APK )向帳號伺服器傳送請求,獲取Authorization Code 。
5. HMS Core (APK )展示帳號伺服器的使用者登入授權介面,介面上會根據登入請求中攜帶的授權域(scopes )資訊, 顯式告知使用者需要授權的內容。
6. 使用者允許授權。
7. 帳號伺服器返回Authorization Code 資訊給HMS Core (APK )。
8. HMS Core (APK )返回Authorization Code 資訊給帳號SDK 。
9. 帳號SDK 返回Authorization Code 資訊給應用客戶端。
10. 應用客戶端將獲取到的Authorization Code 資訊發給應用伺服器。
11. 應用伺服器向帳號伺服器傳送請求,獲取Access Token 、Refresh Token 、ID Token 資訊。
12. 帳號伺服器返回Access Token 、Refresh Token 、ID Token 資訊。
從流程中可以看到,裡面涉及的華為帳號SDK 和HMS Core APK ,當前HMS Core apk 在所有華為新發布的手機中已經預裝了,如果沒有裝的話,在登入華為帳號的時候也會提示使用者安裝,這是在華為手機等移動端上的流程,後續在非華為手機、及其他移動端裝置上華為也會有相對應的出端方案,這部分讓我們拭目以待。
Authorization Code 模式服務端開發步驟與介面示例
1 、接收來自客戶端傳送的code
該部分程式碼涉及到客戶端和服務端的互動方式,需要根據自身設計開發,華為沒有提供示例程式碼。
2 、用code 換Access Token
應用伺服器呼叫華為帳號伺服器對應介面將code 換成Access Token 、Refresh Token 。同時將Access Token 、Refresh Token 儲存在應用伺服器。
注:code 有效期只有5 分鐘,且用一次就會失效,失效後需要通知客戶端重新獲取使用者授權。
請求引數:
引數名 |
描述 |
grant_type |
OAuth 2.0 規範定義的欄位,該值固定填 “authorization_code” 。 |
code |
客戶端傳送的授權碼 |
client_id |
App ID ,在建立應用後由華為開發者聯盟為應用分配的唯一標識。 |
client_secret |
App SECRET ,在建立應用後由華為開發者聯盟為應用分配公鑰。 |
redirect_uri |
AppGallery Connect 中設定應用伺服器的回撥地址,用於應用伺服器在獲取使用者授權後獲取憑證 Access Token 。 如果只是除錯的話,可以使用預設的 url :hms://redirect_uri,不需要在AGC上設定 |
請求示例:
POST /oauth2/v3/token HTTP/ 1.1
Host: oauth-login.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=CF3L7XyCVZi52XMdsUzD7Z6ap0/N2qExcNe0AMqTselTtNd1B4DUwTsQ/ 23F PZasC8yI29v+N2s2jMT/T2MXiuc+ 178 I/sYuWVoTyqwBaDqVW82KCMqax
beWBguH4hEENxmDSUIE61Qg5R1F074PiS+qJYnbLI2IBqatS37px8pn5qnuq5oX+UX8XN3/w8HLt4GpakW5Dk1v7hGs&
client_id={app_id}&
client_secret={app_secret}&
redirect_uri=
響應引數:
引數名 |
描述 |
access_token |
使用者的Access Token。 |
refresh_token |
如果應用申請帳號服務時,入參中包含access_type=offline,則會返回此引數,該引數用於重新整理Access Token。 |
expires_in |
Access Token 的過期時間,以秒為單位。預設60分鐘過期。 |
id_token |
如果應用申請帳號服務時,入參scope中包含openid,則會返回此引數(JWT格式資料),包含使用者基本帳號、使用者郵箱等資訊。ID Token的描述資訊請參見ID Token驗證介面中ID Token描述。 |
scope |
生成的憑證Access Token中包含的scope。 |
token_type |
固定返回Bearer,標識返回Access Token的型別。 |
響應示例:
HTTP/ 1.1 200 OK
Content-Type: application/json ; charset=UTF- 8
Cache-Control: no-store
Pragma: no-cache
{
"access_token" : "CFyJ21sNODl16eV9y2vu3CwQk9DBr32BkOcxxgAd7MZUR5th1giyTk5\/kA+QDAyxou+\/5U2zzBRcf3qgLkkFdtbbC+mM3zFV7xj7CC
EMHc5Tw92al0Y=" ,
"refresh_token" : "CF13G0sRaGybtYt7SIyeUILNORtTFwMgz4ao5C7j7vtgLPt6ogmXKjdI8RS\/YlyS71z4DyP6kEMnOrRlmNK0KhdOUNWd+qVLLRsEEHk
qRIKpuAkPvL8=" ,
"expires_in" : 3600 ,
"id_token" : "eyJraWQiOiI3YTNlYjRkNTJmMDdhODM0NDU4MmRhOGQ3MWE1MGQ5MDlmNWM0YmRiZTFkNDQ3MjQ2MDNhZTA2NGM0ZTlkZGYyIiwidHlwIjoi
SldUIiwiYWxnIjoiUlMyNTYifQ.eyJhdF9oYXNoIjoiM0hPdFZYOEdMcG1GSDBWRVlSc1BjdyIsImF1ZCI6IjEwMDczNTE2NyIsInN1YiI6Ik1ERTlYaWFoc3Mw
aWFFNXU2c09PaEY5Mlhvell0Rkt4bUdtbWlhNGtTaEJ3dklLR2ciLCJhenAiOiIxMDA3MzUxNjciLCJpc3MiOiJodHRwczovL2FjY291bnRzLmh1YXdlaS5jb2
0" ,
"scope" : "openid profile email" ,
"token_type" : "Bearer"
}
3 、解析Access Token
獲取到Access Token ,要對其進行解析鑑權,獲取Access Token 中包含的union_id 、open_id 、expire_in 、scope 等資訊。
請求示例:
POST /rest.php?nsp_fmt=JSON&nsp_svc=huawei.oauth2.user.getTokenInfo HTTP/ 1.1
Host: oauth-api.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
open_id=OPENID&
access_token=CFwaKaGpgXEj9LlsDKVARTUL7DFkvbAE2a22HYpRx%2F520JO5UvfWqSc6X7XUwf4Pzo5%2FxC8mByagdMPG%2FHeHDBldhW3tYizcw3
xXSVwJPWK82C8zPM%3D
其中 open_id 為固定值“OPENID”。
響應示例:
HTTP/ 1.1 200 OK
Content-Type: application/json ; charset=UTF- 8
{
"union_id" : "MDHSI1UnQ9wzGzibtoqicNNnUmJbwhicPzHxxiaVHvMtmNd3xw" ,
"scope" : " ,
"open_id" : "MDFAMzAwMDE3NTAxQGI4ODgzNWRmYjE4ZTI2NGFiaZDE2YjI5ODMwMDM3MDA0QDIxYWY3NzVkZmM1ODk1MWY4NzI4YzFiaNGJkMj
E2Y2QyZTUxNzg3NzUzMDcyZTM4ZjkyZTQxYw" ,
"expire_in" : 1123 ,
"client_id" : "300017501"
}
響應引數說明:
引數 |
是否必選 |
引數型別 |
描述 |
client_id |
是 |
Long |
應用 App ID 。 |
expire_in |
是 |
int |
Access Token 的過期時間,單位為秒。預設為 60 分鐘。 |
union_id |
否 |
string |
使用者的 union_id ,由使用者帳號和應用開發者帳號簽名而成,需要應用 ID 包含 com.huawei.android.hms.account.getUnionId 許可權時才會返回。 |
open_id |
否 |
string |
使用者的 open_id ,由使用者帳號和應用 ID 加密生成的,當 Access Token 為使用者級,且入參 open_id 為 OPENID 時才返回。 |
scope |
否 |
string |
使用者授權 scope 列表,當 Access Token 為使用者級時才返回。 |
4 、 判斷 Access Token 、Refresh Token 是否過期
A、 解析AT 後,可獲取該AT 的有效期時間(預設60 分鐘),開發者可以根據這個時間進行倒數計時判斷當前AT 是否即將過期,做好提前保活,這部分程式碼需要我們自行開發;
B、 另一種方式是看用AT 去獲取使用者資訊的時候是否返回AT 過期錯誤碼( NSP_STATUS=6 )來判斷;
C、 RT 是否過期(預設有效期180 天)可以透過用RT 換取AT 時是否返回RT 過期錯誤碼(主錯誤碼: 1203 ,子錯誤碼:11205)來判斷。
5、 Access Token 即將過期或已過期,可用Refresh Token 去華為帳號伺服器重新整理 Access Token
當Access Token 未過期,用Refresh Token 去重新整理不會改變Access Token ,但超時時間會重新整理。
當Access Token 已過期,用Refresh Token 去重新整理,會獲得一個新的Access Token 。
RT 重新整理AT 的介面與用Code 換取AT 的介面類似,只需要將grant_type 換成”refresh_token” 、code 換成Refresh Token ,同時去掉 redirect_uri 引數即可。
請求示例:
POST /oauth2/v3/token HTTP/1.1
Host: oauth-login.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&
client_id=12345&
client_secret=bKaZ0VE3EYrXaXCdCe3d2k9few&
refresh_token=CF2Mm03n0aos9iZZ8nIhfyDtoXy74CXeBi50gVVhMpB0IUzlv9ZwizEvTBhVoF820ZPim0JwNR9j2p1qgEQWnIVYZRlp4T6ez
MgekUnsHBkvNev5rd2MdfQMLP
響應示例:
HTTP/ 1.1 200 OK
Content-Type: application/json ; charset=UTF- 8
Cache-Control: no-store
Pragma: no-cache
{
"access_token" : "CFyJ4J\/l6wuwcFqYOJG4maq2ca8RAV+g0i+mel6qCV5lvqH0PYtW0+BNwfHWg0AqMnW6ZdBvUgs7ijkxMFh1xVP\/B+vQXz3PWsivkK
CuL78XtbLt7vs=" ,
"id_token" : "eyJhbGciOiJSUzI1NiIsImtpZCI6IjExOGRmMjU0YjgzNzE4OWQxYmMyYmU5NjUwYTgyMTEyYzAwZGY1YTQiLCJ0eXAiOiJKV1Qif
Q.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhenAiOiI3ODI0NTY2Njc4OTgtc2M0MzE3Y2l0NGEwMjB0NzdrbGdsbWo1ZjA4YWtnMWIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI3ODI0NTY2Njc4OTgtN2NkNGJpYWRkaGVwNGc4cnZic2VlOGtwcDA5Zm1hNzIuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMDE3MTIxMzkwMzgwNDE2MDc0MTQiLCJlbWFpbCI6Inh1ZXpoZW5odWF0anVAc2l" ,
"expires_in" : 3600 ,
"scope" : "openid profile email" ,
"token_type" : "Bearer"
}
6 、Refresh Token 過期後,應用伺服器需通知客戶端重新申請使用者授權,重新獲取code ,重新整理AT 和RT
該部分程式碼需要我們開發者根據自身設計去開發,華為沒有提供示例程式碼。
注:這個步驟很容易遺漏
7 、使用Access Token 去華為帳號伺服器獲取使用者資訊
應用已經獲取到Access Token 並已申請帳號開放資訊對應許可權後,應用需要獲取帳號使用者名稱稱、頭像、手機號碼、年齡等資訊。
請求示例:
POST /rest.php?nsp_svc=GOpen.User.getInfo HTTP/ 1.1
Host: account.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
access_token=CV46i% 2 BFdM3LEja3z7% 2 BjOGu27mNBsKwBznSoe4MMfKmNw4aGNLisoCKYgbSOJIVhWLOIIVr0nMwVXFu9AvFGKoJmGk% 2F UZdMDytv2bs
amauePs3FG6ZkU% 3D &
getNickName=0
響應示例:
HTTP/ 1.1 200 OK
Content-Type: application/json ; charset=UTF- 8
{
"displayName" : "182******74" ,
"openID" : "MDFAMTAxMDA1MTg1QGFlMzM0OWIyOGY0MzNiaNjI1MDRiaNTI5ODAxYTA3MDhkQDU1MDA4ZTZmNTA2ZTE4ZTg0Yzc2YTlmNGVmN2E1ZjY1OTg4N
WRiaN2QxMzQyMDUzNGMzNTU0YWQ3" ,
"headPictureURL" : "https://upfile-drcn.platform.hicloud.com/FileServer/image/b.0150086000130905592.20180407082531.0815793
9582468778294625163020035.1000.9C3EE92B95EFEF4CAC263604A15953F32C7BC9E8A47D52B774511F75EF34C0D4.jpg"
}
響應引數說明:
引數 |
是否必選 |
引數型別 |
描述 |
openID |
是 |
string |
使用者openID。 |
displayName |
是 |
string |
getNickName 為0或不傳時,按照匿名化帳號、暱稱的先後順序返回。 |
getNickName 為1時,按照暱稱、匿名化帳號的先後順序返回。 | |||
headPictureURL |
否 |
string |
使用者頭像。 |
mobileNumber |
否 |
string |
使用者手機號。 |
srvNationalCode |
否 |
string |
使用者服務地國家。 |
nationalCode |
否 |
string |
使用者註冊地。 |
birthDate |
否 |
string |
生日。 |
ageGroupFlag |
否 |
Int |
年齡段。 |
-1 :年齡未知(沒輸入生日) 。 | |||
0 :成人。 | |||
1 :未成人,介於兒童和成人之間。 | |||
2 :兒童。 | |||
|
否 |
string |
使用者郵箱。 |
注:當應用有獲取頭像、手機號、服務地國家、註冊地、生日、年齡段、郵箱許可權後才返回對應資訊。
服務端相關示例程式碼可參考
**後續筆者會不斷輸出相關領域的優質內容,希望大家持續關注本帳號!**
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997171/viewspace-2768524/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 華為帳號服務學習筆記(一):什麼是HMS,什麼是華為帳號服務筆記
- 華為帳號服務學習筆記(二):OAuth2.0協議詳解筆記OAuth協議
- 華為帳號服務學習筆記(五):OpenID Connect協議詳解筆記協議
- CIFS服務端開發筆記服務端筆記
- Kubernetes學習筆記(四):服務筆記
- springCloud學習筆記2(服務發現)SpringGCCloud筆記
- nacos學習筆記之服務發現中心筆記
- 【Insights直播】華為帳號服務,打造全場景安全帳號體系
- [翻譯]微服務設計模式 - 5. 服務發現 - 服務端服務發現微服務設計模式服務端
- 小白的學習筆記——服務拆分和遠端呼叫筆記
- 【接入指南】一個Demo帶你玩轉華為帳號服務
- Laravel底層學習筆記02 - 服務容器,服務提供者Laravel筆記
- Insights直播回顧| 華為帳號服務,打造全場景安全帳號體系
- 分散式服務框架開發筆記分散式框架筆記
- Consul 學習筆記-服務註冊筆記
- Laravel 學習筆記 —— 神奇的服務容器Laravel筆記
- 【FAQ】接入華為帳號服務過程中常見問題總結
- web學習:服務端開發的業務需求-路由解析Web服務端路由
- 服務端開發小感服務端
- angular學習筆記(十五)-module裡的'服務'Angular筆記
- angular學習筆記(二十九)-$q服務Angular筆記
- Symfony2 學習筆記之服務容器筆記
- 華為帳號服務助力應用運營和使用者轉化
- 微信開發服務號鑑權
- go語言遊戲服務端開發(三)——服務機制Go遊戲服務端
- Android服務端開發之使用Eclipse搭建Java Web服務端Android服務端EclipseJavaWeb
- 4_webflux服務端開發WebUX服務端
- 華為帳號服務升級,助力應用快速驗證使用者身份
- 今日學習筆記:hash 以及 nodejs基本服務筆記NodeJS
- Angular6學習筆記8: 服務(Service)(1)Angular筆記
- 華為雲服務治理 | 微服務常見故障模式微服務模式
- SpringCloud學習筆記:服務註冊與發現Eureka(2)SpringGCCloud筆記
- Consul服務治理發現學習記錄
- 服務端開發學習路徑圖,心疼小哥哥們服務端
- springcloud微服務實戰 學習筆記二 服務提供者SpringGCCloud微服務筆記
- springcloud微服務實戰 學習筆記三 服務消費者SpringGCCloud微服務筆記
- springcloud微服務實戰 學習筆記六 服務閘道器SpringGCCloud微服務筆記
- go語言遊戲服務端開發(四)——RPC機制Go遊戲服務端RPC