一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - HarmonyOS 第三方登錄之QQ登錄

HarmonyOS 第三方登錄之QQ登錄

2021-12-06 23:41鴻蒙社區dsttl3點cn 編程技術

因為鴻蒙系統剛出不久,官方的第三方登錄SDK還沒出來,下面就介紹下在鴻蒙應用中實現QQ登錄的方法(支持喚起QQ安卓客戶端進行授權)

HarmonyOS 第三方登錄之QQ登錄

前言

因為鴻蒙系統剛出不久,官方的第三方登錄SDK還沒出來,下面就介紹下在鴻蒙應用中實現QQ登錄的方法(支持喚起QQ安卓客戶端進行授權)

前期準備

登錄QQ開放平臺 > 應用管理 > 創建應用 ,創建一個網站應用。

注意:要選擇網站應用,移動應用和小程序不適用該方案。

編寫代碼

判斷是否已登錄

獲取登錄狀態

在入口AbilitySliceMainAbilitySlice中進行判斷。

從數據庫獲取token的值判斷是否已經登錄賬號 (已登錄返回token,未登錄返回null)

  1. // 創建數據庫(這里使用官方提供的“輕量級數據存儲”,相關文檔:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-preference-guidelines-0000000000030083)
  2. Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");
  3. // 從數據庫獲取token的值判斷是否已經登錄賬號 (已登錄返回token,未登錄返回null)
  4. String token = preferences.getString("token",null);

進行相應跳轉

已登錄跳轉至個人界面MyAbility,未登錄跳轉至登錄界面LoginAbility.

  1. if(token != null){
  2. // 已登錄,跳轉至MyAbility
  3. Intent myIntent = new Intent();
  4. myIntent.setParam("token", token);
  5. Operation myOperation = new Intent.OperationBuilder()
  6. .withBundleName("cn.dsttl3.test")
  7. .withAbilityName("cn.dsttl3.qqlogin.MyAbility")
  8. .build();
  9. myIntent.setOperation(myOperation);
  10. startAbility(myIntent);
  11. terminateAbility();
  12. }else {
  13. // 未登錄,跳轉至LoginAbility
  14. Intent loginIntent = new Intent();
  15. Operation loginOperation = new Intent.OperationBuilder()
  16. .withBundleName("cn.dsttl3.test")
  17. .withAbilityName("cn.dsttl3.qqlogin.LoginAbility")
  18. .build();
  19. loginIntent.setOperation(loginOperation);
  20. startAbility(loginIntent);
  21. terminateAbility();
  22. }

登錄界面的操作

申請網絡訪問權限

在config.json添加

  1. "reqPermissions": [
  2. {
  3. "name": "ohos.permission.INTERNET"
  4. }
  5. ]

登錄界面布局文件ability_login.xml

在布局文件中添加以后webview組件

  1. "1.0" encoding="utf-8"?>
  2. xmlns:ohos="http://schemas.huawei.com/res/ohos"
  3. ohos:height="match_parent"
  4. ohos:width="match_parent"
  5. ohos:alignment="center"
  6. ohos:orientation="vertical">
  7. ohos:id="$+id:WebView_qqlogin"
  8. ohos:height="match_parent"
  9. ohos:width="match_parent"/>

登錄界面的AbilitySlice LoginAbilitySlice.java

需要用到的幾個常量

  1. String state = UUID.randomUUID().toString();// 唯一標識,成功授權后回調時會原樣帶回。
  2. String client_id = "101***151";//QQ開放平臺 應用 APP ID
  3. String redirect_uri = "https%3A%2F%2Fapi.dsttl3.cn%2FRedis%2FQQLogin"; //應用 網站回調域 需進行url編碼,授權成功后會跳轉至該鏈接
  4. String authorize_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code" +
  5. "&client_id=" + client_id +
  6. "&redirect_uri=" + redirect_uri +
  7. "&state="+ state;

WebView的配置

  1. WebView myWebView = (WebView) findComponentById(ResourceTable.Id_WebView_qqlogin);
  2. myWebView.getWebConfig().setJavaScriptPermit(true);//支持JavaScript
  3. myWebView.getWebConfig().setUserAgent("android");//將UserAgent設置為安卓,授權頁才顯示QQ客戶端一鍵登錄按鈕

自定義WebAgent

當WebView即將打開一個鏈接時調用isNeedLoadUrl方法,當在網頁上點擊“一鍵登錄”時,打開QQ客戶端

wtloginmqq是QQ安卓客戶端URL Scheme

  1. if (request.getRequestUrl().toString().startsWith("wtloginmqq")){
  2. // 打開QQ客戶端
  3. Intent qqIntent = new Intent();
  4. Operation qqOperation = new Intent.OperationBuilder()
  5. .withAction("android.intent.action.VIEW")
  6. .withUri(Uri.parse(request.getRequestUrl().toString()))
  7. .build();
  8. qqIntent.setOperation(qqOperation);
  9. startAbility(qqIntent);

因為目前還找不到網頁端喚起鴻蒙應用的方法,所以QQ客戶端回調的code放在自己服務器處理。

授權成功后,會打開之前在QQ開放平臺設置的回調域redirect_uri

示例:https://api.dsttl3.cn/Redis/QQLogin?code=********&state=*****

code:QQ授權返回的code,用于申請token

state:在webview請求QQ授權頁面時傳入的唯一標識,用于判斷用戶身份,方便后續從服務器請求token

出于安全考慮 ,請求token操作放在服務器上執行。獲取到token后將token存入數據庫,客戶端通過請求https://api.dsttl3.cn/Redis/Get?key= + state來獲取到token

客戶端請求到token后,將token存儲到數據庫

  1. // 將token存入數據庫
  2. Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");
  3. preferences.putString("token",token);
  4. preferences.flush();

token存儲完成后跳轉至MyAbility

自定義WebAgent完整代碼

  1. myWebView.setWebAgent(new WebAgent(){
  2. // 當WebView即將打開一個鏈接時調用該方法
  3. @Override
  4. public boolean isNeedLoadUrl(WebView webView, ResourceRequest request) {
  5. // request.getRequestUrl().toString() WebView即將打開的鏈接地址
  6. if (request.getRequestUrl().toString().startsWith("wtloginmqq")){
  7. // 打開QQ客戶端
  8. Intent qqIntent = new Intent();
  9. Operation qqOperation = new Intent.OperationBuilder()
  10. .withAction("android.intent.action.VIEW")
  11. .withUri(Uri.parse(request.getRequestUrl().toString()))
  12. .build();
  13. qqIntent.setOperation(qqOperation);
  14. startAbility(qqIntent);
  15. // 向自己的服務器請求token
  16. new Thread(new Runnable() {
  17. @Override
  18. public void run() {
  19. while (true){
  20. String getTokenURL = "https://api.dsttl3.cn/Redis/Get?key=" + state;
  21. try {
  22. OkHttpClient client = new OkHttpClient();
  23. Request request = new Request.Builder().url(getTokenURL).build();
  24. String token = client.newCall(request).execute().body().string();
  25. if (token.length() == 32){
  26. getUITaskDispatcher().asyncDispatch(new Runnable() {
  27. @Override
  28. public void run() {
  29. // 將token存入數據庫
  30. Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");
  31. preferences.putString("token",token);
  32. preferences.flush();
  33. // 跳轉至用戶界面
  34. Intent myIntent = new Intent();
  35. Operation myOperation = new Intent.OperationBuilder()
  36. .withBundleName("cn.dsttl3.test")
  37. .withAbilityName("cn.dsttl3.qqlogin.MyAbility")
  38. .build();
  39. myIntent.setOperation(myOperation);
  40. startAbility(myIntent);
  41. terminateAbility();
  42. }
  43. });
  44. break;
  45. }
  46. Time.sleep(1500);
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. }).start();
  53. return false;
  54. }
  55. return true;
  56. }
  57. });

加載網頁

  1. myWebView.load(authorize_url);

LoginAbilitySlice.java完整代碼

  1. import cn.dsttl3.qqlogin.ResourceTable;
  2. import ohos.aafwk.ability.AbilitySlice;
  3. import ohos.aafwk.content.Intent;
  4. import ohos.aafwk.content.Operation;
  5. import ohos.agp.components.webengine.ResourceRequest;
  6. import ohos.agp.components.webengine.WebAgent;
  7. import ohos.agp.components.webengine.WebView;
  8. import ohos.data.DatabaseHelper;
  9. import ohos.data.preferences.Preferences;
  10. import ohos.miscservices.timeutility.Time;
  11. import ohos.utils.net.Uri;
  12. import okhttp3.OkHttpClient;
  13. import okhttp3.Request;
  14. import java.io.IOException;
  15. import java.util.UUID;
  16. public class LoginAbilitySlice extends AbilitySlice {
  17. //QQ開放平臺登錄授權文檔 https://wiki.connect.qq.com/%e5%87%86%e5%a4%87%e5%b7%a5%e4%bd%9c_oauth2-0
  18. String state = UUID.randomUUID().toString();// 唯一標識,成功授權后回調時會原樣帶回。
  19. String client_id = "101547151";//QQ開放平臺 應用 APP ID
  20. String redirect_uri = "https%3A%2F%2Fapi.dsttl3.cn%2FRedis%2FQQLogin"; //應用 網站回調域 需進行url編碼,授權成功后會跳轉至該鏈接
  21. String authorize_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code" +
  22. "&client_id=" + client_id +
  23. "&redirect_uri=" + redirect_uri +
  24. "&state="+ state;
  25. @Override
  26. public void onStart(Intent intent) {
  27. super.onStart(intent);
  28. super.setUIContent(ResourceTable.Layout_ability_login);
  29. WebView myWebView = (WebView) findComponentById(ResourceTable.Id_WebView_qqlogin);
  30. myWebView.getWebConfig().setJavaScriptPermit(true);
  31. myWebView.getWebConfig().setUserAgent("android");
  32. myWebView.setWebAgent(new WebAgent(){
  33. // 當WebView即將打開一個鏈接時調用該方法
  34. @Override
  35. public boolean isNeedLoadUrl(WebView webView, ResourceRequest request) {
  36. // request.getRequestUrl().toString() WebView即將打開的鏈接地址
  37. if (request.getRequestUrl().toString().startsWith("wtloginmqq")){
  38. // 打開QQ客戶端
  39. Intent qqIntent = new Intent();
  40. Operation qqOperation = new Intent.OperationBuilder()
  41. .withAction("android.intent.action.VIEW")
  42. .withUri(Uri.parse(request.getRequestUrl().toString()))
  43. .build();
  44. qqIntent.setOperation(qqOperation);
  45. startAbility(qqIntent);
  46. // 向自己的服務器請求token
  47. new Thread(new Runnable() {
  48. @Override
  49. public void run() {
  50. while (true){
  51. String getTokenURL = "https://api.dsttl3.cn/Redis/Get?key=" + state;
  52. try {
  53. OkHttpClient client = new OkHttpClient();
  54. Request request = new Request.Builder().url(getTokenURL).build();
  55. String token = client.newCall(request).execute().body().string();
  56. if (token.length() == 32){
  57. getUITaskDispatcher().asyncDispatch(new Runnable() {
  58. @Override
  59. public void run() {
  60. // 將token存入數據庫
  61. Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");
  62. preferences.putString("token",token);
  63. preferences.flush();
  64. // 跳轉至用戶界面
  65. Intent myIntent = new Intent();
  66. Operation myOperation = new Intent.OperationBuilder()
  67. .withBundleName("cn.dsttl3.test")
  68. .withAbilityName("cn.dsttl3.qqlogin.MyAbility")
  69. .build();
  70. myIntent.setOperation(myOperation);
  71. startAbility(myIntent);
  72. terminateAbility();
  73. }
  74. });
  75. break;
  76. }
  77. Time.sleep(1500);
  78. } catch (IOException e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. }
  83. }).start();
  84. return false;
  85. }
  86. return true;
  87. }
  88. });
  89. myWebView.load(authorize_url);
  90. }
  91. }

個人界面

獲取token信息

  1. Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");
  2. String token = preferences.getString("token",null);

更新Text數據

  1. Text text = findComponentById(ResourceTable.Id_text_helloworld);
  2. text.setText(token);

后續操作

獲取用戶信息請參考QQ開放平臺文檔 https://wiki.connect.qq.com/get_user_info

文章相關附件可以點擊下面的原文鏈接前往下載

https://harmonyos.51cto.com/resource/1554

原文鏈接:https://harmonyos.51cto.com

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本人妖网站 | 包臀裙女教师波多野结衣 | 国产精品久久国产精品99 | 天堂网站天堂小说 | 国产精品久久国产精品99盘 | nxgx欧美 | 日韩欧美一区二区不卡 | 成人快手破解版 | 国产欧美另类久久精品91 | 免费看日韩 | h黑寡妇一级毛片 | 久久久久久久电影 | 爽爽窝窝午夜精品一区二区 | xxxxx大片在线观看 | 草莓香蕉榴莲丝瓜秋葵绿巨人在线看 | 亚洲sss综合天堂久久久 | 久久精品观看 | 亚洲国产香蕉视频欧美 | 男人j放进女人的p视频免费 | 极品蜜桃臀美女啪啪 | 日韩高清一区二区三区不卡 | avav男人天堂 | а天堂中文最新版在线官网视频 | 唯美清纯 自拍偷 | 亚洲乱码一区二区三区国产精品 | 女bbwxxxx非洲黑人 | chinesemature精品 chinesefree普通对话 | 9420高清视频在线观看网百度 | 嫩草视频在线观看视频播放 | 欧美三级做爰全过程 | 男人午夜禁片在线观看 | 国产v在线在线观看羞羞答答 | 国产欧美精品一区二区三区四区 | 国产成人手机在线好好热 | 亚洲香蕉视频 | 国产在线观看精品 | 欧美福利二区 | 亚洲第一天堂网 | 久久99亚洲AV无码四区碰碰 | 睡男神的这件小事小说在线阅读 | 被强上后我成瘾了小说 |