華為帳號服務學習筆記(四):Authorization Code模式服務端開發

凌霄科技發表於2021-04-17

筆者在《華為帳號服務學習筆記(二):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 :兒童。

email

string

使用者郵箱。

注:當應用有獲取頭像、手機號、服務地國家、註冊地、生日、年齡段、郵箱許可權後才返回對應資訊。

 

服務端相關示例程式碼可參考


**後續筆者會不斷輸出相關領域的優質內容,希望大家持續關注本帳號!**


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997171/viewspace-2768524/,如需轉載,請註明出處,否則將追究法律責任。

相關文章