H5網頁使用支付寶授權登錄獲取用戶信息詳解

用戶信息授權

用戶信息授權主要是爲了獲取支付寶用戶ID(USER_ID)、授權令牌(access_token),便於開發者處理自身業務邏輯的時候使用,例如:獲取支付寶用戶信息、發會員卡、快捷登錄等。授權支持多種場景,如:H5(需安裝支付寶手機客戶端)、PC、APP(可參考APP支付寶登錄)。

PC授權頁面示例:
undefined

H5授權頁面示例:
image

若要實現用戶信息授權功能,請按照下面的步驟實現即可。

一、應用設置

  1. 您需要先去支付寶開放平臺(open.alipay.com),在開發者中心創建登記您的應用,此時您將獲得應用唯一標識(APPID);
  2. 請在【功能信息】中點擊【添加功能】,選擇【獲取會員信息】;
  3. 設置密鑰(如下圖);
  4. 設置授權回調地址(如下圖),授權回調地址是用戶授權結束後回跳的地址,用於接收用戶授權的結果,如:授權、拿到auth_code,便於後續換取授權令牌(access_token)等;
  5. 提交審覈,等待審覈通過,該應用正式可以使用。

 需要詳細瞭解開放平臺創建應用步驟請參考《開放平臺應用創建指南》。
image

圖1 設置密鑰、授權回調地址
 
image

添加功能【獲取會員信息】
 
image

添加功能【獲取會員信息】

二、搭建和配置開發環境

1. 下載服務端SDK
爲了幫助開發者調用開放接口,我們提供了開放平臺服務端SDK,包含JAVA、PHP和.NET三個語言版本,封裝了簽名&驗籤、HTTP接口請求等基礎功能。請先下載對應語言版本的SDK並引入您的開發工程。
各語言版本服務端SDK詳細使用說明,請參考《服務端SDK說明》。
2. 接口調用配置
在SDK調用前需要進行初始化,以Java代碼爲示例如下:

AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);

關鍵參數說明:

配置參數 示例值解釋 獲取方式/示例值
URL 支付寶網關(固定) https://openapi.alipay.com/gateway.do
APPID APPID 即創建應用後生成 獲取見上面應用設置
APP_PRIVATE_KEY 開發者私鑰,由開發者自己生成 獲取詳見上面應用設置
FORMAT 參數返回格式,只支持json json(固定)
CHARSET 編碼集,支持GBK/UTF-8 開發者根據實際工程編碼配置
ALIPAY_PUBLIC_KEY 支付寶公鑰,由支付寶生成 獲取詳見上面應用設置
SIGN_TYPE 商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA2和RSA,推薦使用RSA2 RSA2

三、開發授權功能

授權完整流程如下:
image

需要開發的關鍵點是:獲取auth_code、auth_code換取access_token與user_id、使用token完成其他業務處理,如token換取用戶信息等。

第一步:URL拼接與scope詳解

商戶/開發者通過以下的 URL 拼接規則拼接用戶授權的 URL 地址,該地址展示給用戶,用戶需在支付寶端點開 URL 地址,並點擊授權,商戶/開發者即可獲得用戶的授權。
url拼接規則:https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_URL

TIPS:沙箱拼接規則詳見關於沙箱

url參數說明

參數名 是否必須 長度 描述
app_id 16 開發者應用的app_id; 相同支付寶賬號下,不同的app_id獲取的token切忌混用。
scope 不定,取決於請求授權時scope個數 接口權限值,目前只支持auth_user(獲取用戶信息網站支付寶登錄)、auth_base(用戶信息授權)、auth_ecard(商戶會員卡)、auth_invoice_info(支付寶閃電開票)、auth_puc_charge(生活繳費)五個值;多個scope時用”,”分隔,如scope爲”auth_user,auth_ecard”時,此時獲取到的access_token,既可以用來獲取用戶信息,又可以給用戶發送會員卡。
redirect_uri 100 授權回調地址,是經過URLENCODE轉義 的url鏈接(url必須以http或者https開頭); 在請求之前,開發者需要先到開發者中心對應應用內,配置授權回調地址。 redirect_uri與應用配置的授權回調地址域名部分必須一致。
state 100 商戶自定義參數,用戶授權後,重定向到redirect_uri時會原樣回傳給商戶。 爲防止CSRF攻擊,建議開發者請求授權時傳入state參數,該參數要做到既不可預測,又可以證明客戶端和當前第三方網站的登錄認證狀態存在關聯。

第二步:獲取auth_code

當用戶授權成功後,會跳轉至開發者定義的回調頁面,支付寶會在回調頁面請求中加入參數,包括auth_code、app_id、scope等,支付寶請求開發者回調頁面示例如下:

http或https打頭的授權回調地址? app_id=2016032301002387 &scope=auth_user&auth_code=10e20498fe5d42f18427d893fc06WX59

關鍵返回參數說明:

參數名 是否必須 長度 描述
app_id 16 開發者應用的app_id;相同支付寶賬號下,不同的app_id獲取的token切忌混用。
scope 不定,取決於請求授權時scope個數 成功授權的接口權限值,目前只支持auth_user(獲取用戶信息網站支付寶登錄)、auth_base(用戶信息授權)、auth_ecard(商戶會員卡)、auth_invoice_info(支付寶閃電開票)、auth_puc_charge(生活繳費)五個值;多個scope時用“,”分隔,如scope爲“auth_user,auth_ecard”時,此時獲取到的access_token,既可以用來獲取用戶信息,又可以給用戶發送會員卡
error_scope 不定,少於請求授權時scope個數 error_scope表示授權是失敗的scope列表及對應的錯誤信息(錯誤列表之間用“
state 100 商戶自定義參數,用戶授權後,重定向到redirect_uri時會原樣回傳給商戶。 爲防止CSRF攻擊,建議開發者請求授權時傳入state參數,該參數要做到既不可預測,又可以證明客戶端和當前第三方網站的登錄認證狀態存在關聯。
auth_code 目前爲32,後期會根據安全策略適當調整,請勿限制該字段長度。 臨時授權碼,一次性有效,同時若超過有效期未使用,則會失效。有效期目前至少爲5分鐘,最長爲24小時。請獲取auth_code後儘快通過調用alipay.system.oauth.token接口獲取訪問令牌

注意:其餘返回字段無需關注。

第三步:auth_code換取access_token與user_id

通過接口 alipay.system.oauth.token 獲取access_token及userId。
接口調用示例:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); 
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode("2e4248c2f50b4653bf18ecee3466UC18");
request.setGrantType("authorization_code");
try {
    AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
    System.out.println(oauthTokenResponse.getAccessToken());
	System.out.println(oauthTokenResponse.getUserId());
} catch (AlipayApiException e) {
    //處理異常
    e.printStackTrace();
}

至此,用戶信息授權流程已結束,如果只想拿到user_id(支付寶用戶唯一標識符),則無需看下一步。

第四步:使用access_token完成其他業務處理

開放平臺的部分接口中需要依賴access_token才能執行的,因此爲了拿到這個數據,需要執行以上的兩個步驟才能換取到。
另外,不同的scopes的值對應的是不同的access_token,不同的token可調用不同的接口,token的效用也因此不一樣,所以這些token切忌混用,具體的接口調用場景可參考:

獲取會員信息
網站支付寶登錄
商戶會員卡 
支付寶閃電開票
APP支付寶登錄
生活繳費

授權接入注意事項【必讀】

1、用戶授權auth_code

說明:
auth_code一次有效,auth_code有效期爲3分鐘到24小時(開放平臺規則會根據具體的業務場景動態調整auth_code的有效期,但是不會低於3分鐘,同時也不會超過24小時),超過有效期的auth_code即使未使用也將無法使用。
用戶的每次授權動作都會生成一個新的auth_code。
建議:
基於安全考慮,開發者在獲取auth_code(用戶授權碼)後應儘快調用alipay.system.oauth.token接口換取access_token(訪問令牌)。

2、授權scope

說明:
scope爲公開的資源,其使用不需要簽約。
開發者可以在授權請求中包含一個或者多個用戶授權範圍,每個授權範圍稱爲一個scope,一個scope包含若干個開放平臺接口,請求的多個scope通過英文逗號分隔。
授權的流程是通用的,在不同的業務場景需要授權的範圍不同,需要根據具體產品接入文檔中指定的scope替換本文中的scope參數。

scope有效期:
這裏的scope有效期和前面的auth_code有效期是兩個概念。
scope的有效期會影響開發者最終獲取到的access_token和refresh_token的有效期,不同scope的有效期請參考具體的產品文檔。

建議:
爲了產品體驗考慮請按需請求需要的scope,過多的授權範圍容易導致用戶放棄授權。建議在做產品的登錄場景中使用auth_base或者auth_user做用戶引流,後續根據需要具體業務需要引導用戶請求特定scope的用戶授權。

3、access_token

有效期:
access_token取決於授權時指定的scope的有效期,如果授權時指定多個scope,最終的access_token的有效期取決於有效期最短的scope。
       access_token截止時間=(授權時間點)+(授權後調用alipay.system.oauth.token返回的expires_in)

令牌存儲要求:

  • 確保access_token的安全保存;
  • 根據appId+uid+單個scope爲索引保存access_token,否則會因爲appid令牌混用和不同scope的令牌相互覆蓋導致接口調用報錯,若前後多次授權範圍相同,僅保存授權截止時間最長的access_token即可。授權截止時間=授權時間點+alipay.system.oauth.token返回的expires_in。

注意:用戶可以取消授權,取消後access_token即使在有效期也無法使用

4、刷新令牌

說明:
用auth_code調用alipay.system.oauth.token接口獲取access_token時會返回一個refresh_token(刷新令牌),在refresh_token有效期內可以通過refresh_token同樣調用alipay.system.oauth.token刷新一個新的access_token

有效期:
refresh_token取決於授權時指定的scope的有效期,如果授權時指定多個scope,最終的refresh_token的有效期取決於有效期最短的scope。
refresh_token截止時間=(調用alipay.system.oauth.token的時間+alipay.system.oauth.token返回的re_expires_in)

使用:
使用refresh_token調用alipay.system.oauth.token
刷新後可以得到一個新的access_token,access_token截止時間重新計算(對應可以看到expires_in不會變),原來的accesss_token會立即失效;同時會得到一個新的refresh_token,原來的refresh_token會失效,新refresh_token截止時間不會重新計算(對應可以看到re_expires_in會減少)

注意:用戶可以取消授權,取消後refresh_token即使在有效期也無法使用

授權登錄安全建議

若你希望通過支付寶授權進行平臺登錄,同時爲了讓登錄服務享受支付寶的安全能力,需要你在接入授權時做一些校驗和處理,強烈建議做如下處理:

state防止CSRF

在 拼接授權鏈接做用戶授權,在拼接鏈接中提供state參數(該參數的值需要和用戶在開發者網站會話有綁定關係,同時保證一次性有效),在授權後支付寶回跳商戶地址時會將該參數原樣返回。在以下情況開發者應該拒絕服務:回跳鏈接中無state參數或者state的值與開發者平臺session中記錄的state參數不一致。state格式:不超過100長度的base64字符。

Referer校驗

在瀏覽器的授權回跳地址的處理邏輯中做Http的Referer校驗,目前螞蟻金服授權產品的域名均在alipay.com下,建議將此配置做成可配置的。

授權回調地址建議

1、條件允許的情況下回跳地址強制要求https。推薦使用阿里雲證書服務(阿里雲提供免費的證書服務,只需要您有自己的域名即可使用);
2、開放平臺授權地址配置時僅使用不帶參數的地址,防止字符集問題導致的業務失敗。需要的業務參數可以統一通過state參數傳遞;
3、儘量保證授權回調地址頁面本身的安全性,包括但不限於頁面所在服務器自身的安全性等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章