关于百度oauth2.0登陆的诸多问题
眾所周知(至少對于用百度作為第三方平臺的人是的),百度賬號登陸是真的很容易申請到一個id,但是,他有一個問題,就是:
很容易出錯
我做這個東西的時候,至少弄出了不下十個錯誤。現在,我就告訴大家這些問題如何解決
1、百度開發者管理中心怎么進
回答:不要指望在百度上能直接找到連接,你只能點擊下方鏈接進入,也不要指望在百度開發者中心主頁進入,更不要指望著自己亂猜網址。
連接:http://developer.baidu.com/console#app/project點擊此處跳轉
(你要是亂打網址進去了,那么:歐皇,請受我一拜!)
2、怎么創建應用
點擊創建工程(若按鈕被百度隱藏,請點擊此處或復制下方鏈接http://developer.baidu.com/console#app/create)
按提示填寫相關信息
至此,創建工程就可以了
3、怎么登陸
這個問題可算是折騰我半天了。
1、初始設置
點擊你要進入的工程
按圖示填寫信息,然后點擊保存
====================
至此,你已經搞定了后臺工作
====================
廢話不多說,php代碼直接上
1、注冊(我是在注冊時強制綁定百度賬號的,但是如果你只是想作為一種第三方登陸工具,也可以參考,你可以只看獲取code和access_token的部分
2、登陸
<?php//常量設置 $con = mysql_connect("localhost","這里填寫賬號",這里填寫密碼); if (!$con) {die('Could not connect: ' . mysql_error()); } mysql_select_db("sfydb_6273437", $con); Login();//主函數 function Login() {$Password=decryptForDotNet($_GET['Password'],"AA");$Userid=$_GET['Userid'];$result = mysql_query("SELECT * FROM userlist where Userid = '".$Userid."'");$count=mysql_num_rows($result);if($count==0){die("NoUser");}$row = mysql_fetch_array($result);if($row['Password']!=$_GET['Password']){die("WrongPassword");}if($row['BaiduUid']==""){die("NoToken.PleaseUseRegister");}//生成Cookie$Cookie = '';for ($i=1;$i<=1024;$i++){ $randstr = chr(rand(97,122));$Cookie .= $randstr; }$Cookie =encryptForDotNet($Cookie,"t68[]a*G");mysql_query("UPDATE userlist SET Cookie = '.$Cookie.' WHERE Userid='".$Userid."'");die("=".$Cookie); } //加密 function encryptForDotNet($input, $key) {$iv = $key;$addnum = 8 - ( strlen($input) % 8 );for ($i = 0; $i < $addnum; $i++){$input .= chr($addnum);}$output = mcrypt_encrypt(MCRYPT_DES, $key, $input, MCRYPT_MODE_CBC, $iv);return base64_encode($output); } //解密 function decryptForDotNet($input, $key) {$iv = $key;$output = base64_decode($input);$output = mcrypt_decrypt(MCRYPT_DES, $key, $output, MCRYPT_MODE_CBC, $iv);for ($i = 0; $i <= 8; $i++){$output = str_replace(chr($i), "", $output);}return $output; } ?>至此,后端搞定
廢話還是不多說,再來個前端VBNET代碼
1、代碼
Imports System.Security.Cryptography Imports System.Text Imports System.IOPublic Class LoginPrivate Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChangedIf CheckBox1.Checked = True ThenTextBox1.PasswordChar = ""TextBox2.PasswordChar = ""ElseTextBox1.PasswordChar = "*"TextBox2.PasswordChar = "*"End IfEnd SubPrivate Sub RadioButton1_Click(sender As Object, e As EventArgs) Handles RadioButton1.ClickTextBox1.Enabled = FalseGroupBox2.Enabled = FalseTextBox1.Text = ""End SubPrivate Sub RadioButton2_Click(sender As Object, e As EventArgs) Handles RadioButton2.ClickTextBox1.Enabled = TrueEnd SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim LoginResult1 As String = ""If RadioButton1.Checked = True ThenLoginResult1 = CookieCenter.Password_Sign_in(TextBox3.Text, TextBox2.Text)If LoginResult1 <> "OK" ThenMsgBox(LoginResult1, MsgBoxStyle.Exclamation, "Error")End IfElseIf TextBox1.Text <> TextBox2.Text ThenMsgBox("DifferentPassword", MsgBoxStyle.Exclamation, "Error")ReturnEnd IfIf CookieCenter.CheckUnallowedChar(TextBox3.Text) = False OrElse CookieCenter.CheckUnallowedChar(TextBox2.Text) = False ThenMsgBox("IncludesUnecpectedChar", MsgBoxStyle.Exclamation, "Error")ReturnEnd IfIf TextBox3.Text.Length > 20 OrElse TextBox2.Text.Length > 20 ThenMsgBox("UserOrPasswordToLong", MsgBoxStyle.Exclamation, "Error")ReturnEnd IfIf TextBox3.Text.Length < 4 OrElse TextBox2.Text.Length < 6 ThenMsgBox("UserOrPasswordToShort", MsgBoxStyle.Exclamation, "Error")ReturnEnd IfGroupBox2.Enabled = TrueTextBox4.Text = "Http://sscczzjj.top/?firstinto=abc&Userid=" + TextBox3.Text + "&Password=" + SecurityCenter.EncriptStr(TextBox2.Text, "AA").Replace("=", "%3D")WebBrowser1.Url = New Uri("Http://sscczzjj.top/?firstinto=abc&Userid=" + TextBox3.Text + "&Password=" + SecurityCenter.EncriptStr(TextBox2.Text, "AA").Replace("=", "%3D"))'LoginResult1 = CookieCenter.Sign_up(TextBox3.Text, TextBox2.Text)End IfEnd Sub End ClassPublic Class SecurityCenter '與php配套的加解密Public Shared Function EncriptStr(ByVal input As String, ByVal password As String, ByVal Optional encoding As Encoding = Nothing) As Stringencoding = If(encoding, Encoding.[Default])Dim iv = encoding.GetBytes(password)Dim key = encoding.GetBytes(password)Dim datas = encoding.GetBytes(input)Dim desCryptoServiceProvider = New DESCryptoServiceProvider()Using memoryStream = New MemoryStream()Using cryptoStream = New CryptoStream(memoryStream, desCryptoServiceProvider.CreateEncryptor(iv, key), CryptoStreamMode.Write)cryptoStream.Write(datas, 0, datas.Length)cryptoStream.FlushFinalBlock()Return Convert.ToBase64String(memoryStream.ToArray())End UsingEnd UsingEnd FunctionPublic Shared Function DecriptStr(ByVal input As String, ByVal password As String, ByVal Optional encoding As Encoding = Nothing) As Stringencoding = If(encoding, Encoding.[Default])Dim iv = encoding.GetBytes(password)Dim key = encoding.GetBytes(password)Dim datas = Convert.FromBase64String(input)Dim desCryptoServiceProvider = New DESCryptoServiceProvider()Using memoryStream = New MemoryStream()Using cryptoStream = New CryptoStream(memoryStream, desCryptoServiceProvider.CreateDecryptor(iv, key), CryptoStreamMode.Write)cryptoStream.Write(datas, 0, datas.Length)cryptoStream.FlushFinalBlock()Return encoding.GetString(memoryStream.ToArray())End UsingEnd UsingEnd Function End ClassPublic Class HttpRequestionsPublic Shared Function POST(ByVal URL$, ByVal data$)Dim httpOn Error Resume Nexthttp = CreateObject("WinHttp.WinHttpRequest.5.1")With http.Open("POST", URL, True).Send(data) '發送請求.WaitForResponse() '一直等待到有回應再繼續End WithDim request = http.responseText '此處用于儲存返回的數據包http = Nothing '清理掉舊的http請求信息防止二次調用時裂開Return request '返回數據包End FunctionPublic Shared Function GET1(ByVal URL$)Dim httpOn Error Resume Nexthttp = CreateObject("WinHttp.WinHttpRequest.5.1")With http.Open("GET1", URL, True).Send() '發送請求.WaitForResponse() '一直等待到有回應再繼續End WithDim request = http.responseText '此處用于儲存返回的數據包http = Nothing '清理掉舊的http請求信息防止二次調用時裂開Return request '返回數據包End Function End ClassPublic Class CookieCenterPublic Cookie1 As String = ""'Public Key As String = "gYt6&^a;"Public EPassword As String = ""Public Shared Function Password_Sign_in(ByVal User As String, ByVal Password As String) As StringIf CheckUnallowedChar(User) = False OrElse CheckUnallowedChar(Password) = False ThenReturn "IncludesUnecpectedChar"End IfIf User.Length > 20 OrElse Password.Length > 20 ThenReturn "UserOrPasswordToLong"End IfIf User.Length < 4 OrElse Password.Length < 6 ThenReturn "UserOrPasswordToShort"End IfDim result As String = ""result = HttpRequestions.POST("Http://sscczzjj.top/PasswordLogin.php?Userid=" + User + "&Password=" + SecurityCenter.EncriptStr(Password, "AAA"), "")If result.StartsWith("=") = True ThenMy.Settings("Cookie") = result.Replace("=", "")Return "OK"ElseMsgBox(result, MsgBoxStyle.Exclamation, "Error")Return "Failed"End IfEnd FunctionPublic Shared Function CheckUnallowedChar(ByVal CheckStringed As String) As BooleanFor i = 32 To 47If CheckStringed.Replace(ChrW(i), "") <> CheckStringed ThenReturn FalseEnd IfNextFor i = 58 To 63If CheckStringed.Replace(ChrW(i), "") <> CheckStringed ThenReturn FalseEnd IfNextFor i = 91 To 96If CheckStringed.Replace(ChrW(i), "") <> CheckStringed ThenReturn FalseEnd IfNextFor i = 123 To 127If CheckStringed.Replace(ChrW(i), "") <> CheckStringed ThenReturn FalseEnd IfNextReturn TrueEnd Function End Class2、設計器代碼
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Partial Class LoginInherits System.Windows.Forms.Form'Form 重寫 Dispose,以清理組件列表。<System.Diagnostics.DebuggerNonUserCode()> _Protected Overrides Sub Dispose(ByVal disposing As Boolean)TryIf disposing AndAlso components IsNot Nothing Thencomponents.Dispose()End IfFinallyMyBase.Dispose(disposing)End TryEnd Sub'Windows 窗體設計器所必需的Private components As System.ComponentModel.IContainer'注意: 以下過程是 Windows 窗體設計器所必需的'可以使用 Windows 窗體設計器修改它。 '不要使用代碼編輯器修改它。<System.Diagnostics.DebuggerStepThrough()> _Private Sub InitializeComponent()Me.WebBrowser1 = New System.Windows.Forms.WebBrowser()Me.TabControl1 = New System.Windows.Forms.TabControl()Me.LAR = New System.Windows.Forms.TabPage()Me.GroupBox2 = New System.Windows.Forms.GroupBox()Me.GroupBox1 = New System.Windows.Forms.GroupBox()Me.TextBox4 = New System.Windows.Forms.TextBox()Me.Label6 = New System.Windows.Forms.Label()Me.Label4 = New System.Windows.Forms.Label()Me.Button1 = New System.Windows.Forms.Button()Me.CheckBox1 = New System.Windows.Forms.CheckBox()Me.RadioButton2 = New System.Windows.Forms.RadioButton()Me.RadioButton1 = New System.Windows.Forms.RadioButton()Me.Label5 = New System.Windows.Forms.Label()Me.TextBox3 = New System.Windows.Forms.TextBox()Me.TextBox2 = New System.Windows.Forms.TextBox()Me.TextBox1 = New System.Windows.Forms.TextBox()Me.Label3 = New System.Windows.Forms.Label()Me.Label2 = New System.Windows.Forms.Label()Me.Label1 = New System.Windows.Forms.Label()Me.TabControl1.SuspendLayout()Me.LAR.SuspendLayout()Me.GroupBox2.SuspendLayout()Me.GroupBox1.SuspendLayout()Me.SuspendLayout()''WebBrowser1'Me.WebBrowser1.Dock = System.Windows.Forms.DockStyle.FillMe.WebBrowser1.Location = New System.Drawing.Point(3, 17)Me.WebBrowser1.MinimumSize = New System.Drawing.Size(20, 20)Me.WebBrowser1.Name = "WebBrowser1"Me.WebBrowser1.Size = New System.Drawing.Size(500, 464)Me.WebBrowser1.TabIndex = 0Me.WebBrowser1.Url = New System.Uri("", System.UriKind.Relative)''TabControl1'Me.TabControl1.Appearance = System.Windows.Forms.TabAppearance.ButtonsMe.TabControl1.Controls.Add(Me.LAR)Me.TabControl1.Dock = System.Windows.Forms.DockStyle.FillMe.TabControl1.ItemSize = New System.Drawing.Size(150, 21)Me.TabControl1.Location = New System.Drawing.Point(0, 0)Me.TabControl1.Name = "TabControl1"Me.TabControl1.SelectedIndex = 0Me.TabControl1.Size = New System.Drawing.Size(862, 521)Me.TabControl1.SizeMode = System.Windows.Forms.TabSizeMode.FixedMe.TabControl1.TabIndex = 1''LAR'Me.LAR.AutoScroll = TrueMe.LAR.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingleMe.LAR.Controls.Add(Me.GroupBox2)Me.LAR.Controls.Add(Me.GroupBox1)Me.LAR.Location = New System.Drawing.Point(4, 25)Me.LAR.Name = "LAR"Me.LAR.Padding = New System.Windows.Forms.Padding(3)Me.LAR.Size = New System.Drawing.Size(854, 492)Me.LAR.TabIndex = 0Me.LAR.Text = "Login And Register"Me.LAR.UseVisualStyleBackColor = True''GroupBox2'Me.GroupBox2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrinkMe.GroupBox2.Controls.Add(Me.WebBrowser1)Me.GroupBox2.Dock = System.Windows.Forms.DockStyle.RightMe.GroupBox2.Enabled = FalseMe.GroupBox2.Location = New System.Drawing.Point(343, 3)Me.GroupBox2.Name = "GroupBox2"Me.GroupBox2.Size = New System.Drawing.Size(506, 484)Me.GroupBox2.TabIndex = 3Me.GroupBox2.TabStop = FalseMe.GroupBox2.Text = "未授權用戶可以在這里授權"''GroupBox1'Me.GroupBox1.Controls.Add(Me.TextBox4)Me.GroupBox1.Controls.Add(Me.Label6)Me.GroupBox1.Controls.Add(Me.Label4)Me.GroupBox1.Controls.Add(Me.Button1)Me.GroupBox1.Controls.Add(Me.CheckBox1)Me.GroupBox1.Controls.Add(Me.RadioButton2)Me.GroupBox1.Controls.Add(Me.RadioButton1)Me.GroupBox1.Controls.Add(Me.Label5)Me.GroupBox1.Controls.Add(Me.TextBox3)Me.GroupBox1.Controls.Add(Me.TextBox2)Me.GroupBox1.Controls.Add(Me.TextBox1)Me.GroupBox1.Controls.Add(Me.Label3)Me.GroupBox1.Controls.Add(Me.Label2)Me.GroupBox1.Controls.Add(Me.Label1)Me.GroupBox1.Dock = System.Windows.Forms.DockStyle.LeftMe.GroupBox1.Location = New System.Drawing.Point(3, 3)Me.GroupBox1.Name = "GroupBox1"Me.GroupBox1.Size = New System.Drawing.Size(334, 484)Me.GroupBox1.TabIndex = 2Me.GroupBox1.TabStop = FalseMe.GroupBox1.Text = "登陸"''TextBox4'Me.TextBox4.Location = New System.Drawing.Point(77, 207)Me.TextBox4.Name = "TextBox4"Me.TextBox4.ReadOnly = TrueMe.TextBox4.Size = New System.Drawing.Size(248, 21)Me.TextBox4.TabIndex = 13''Label6'Me.Label6.AutoSize = TrueMe.Label6.Location = New System.Drawing.Point(18, 210)Me.Label6.Name = "Label6"Me.Label6.Size = New System.Drawing.Size(53, 12)Me.Label6.TabIndex = 12Me.Label6.Text = "你的鏈接"''Label4'Me.Label4.AutoSize = TrueMe.Label4.Location = New System.Drawing.Point(18, 131)Me.Label4.Name = "Label4"Me.Label4.Size = New System.Drawing.Size(299, 72)Me.Label4.TabIndex = 1Me.Label4.Text = "1、為了防止某些別有用心的人隨意注冊賬號,注冊需要" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "與百度賬號綁定,輸入完密碼之后您可以獲得激活鏈" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "接,您可以復制鏈接后在瀏覽器打開以完成驗證,也" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "可以在右" &"側的窗口中登陸百度賬號驗證" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "2、鏈接中包含密碼的密文,請勿外泄" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "3、在授權成功之前,此賬號仍可被其他用戶注冊"''Button1'Me.Button1.Location = New System.Drawing.Point(250, 99)Me.Button1.Name = "Button1"Me.Button1.Size = New System.Drawing.Size(75, 23)Me.Button1.TabIndex = 11Me.Button1.Text = "執行"Me.Button1.UseVisualStyleBackColor = True''CheckBox1'Me.CheckBox1.AutoSize = TrueMe.CheckBox1.Location = New System.Drawing.Point(172, 102)Me.CheckBox1.Name = "CheckBox1"Me.CheckBox1.Size = New System.Drawing.Size(72, 16)Me.CheckBox1.TabIndex = 10Me.CheckBox1.Text = "顯示密碼"Me.CheckBox1.UseVisualStyleBackColor = True''RadioButton2'Me.RadioButton2.AutoSize = TrueMe.RadioButton2.Location = New System.Drawing.Point(119, 102)Me.RadioButton2.Name = "RadioButton2"Me.RadioButton2.Size = New System.Drawing.Size(47, 16)Me.RadioButton2.TabIndex = 9Me.RadioButton2.TabStop = TrueMe.RadioButton2.Text = "注冊"Me.RadioButton2.UseVisualStyleBackColor = True''RadioButton1'Me.RadioButton1.AutoSize = TrueMe.RadioButton1.Checked = TrueMe.RadioButton1.Location = New System.Drawing.Point(66, 102)Me.RadioButton1.Name = "RadioButton1"Me.RadioButton1.Size = New System.Drawing.Size(47, 16)Me.RadioButton1.TabIndex = 8Me.RadioButton1.TabStop = TrueMe.RadioButton1.Text = "登陸"Me.RadioButton1.UseVisualStyleBackColor = True''Label5'Me.Label5.AutoSize = TrueMe.Label5.Location = New System.Drawing.Point(30, 104)Me.Label5.Name = "Label5"Me.Label5.Size = New System.Drawing.Size(29, 12)Me.Label5.TabIndex = 7Me.Label5.Text = "操作"''TextBox3'Me.TextBox3.Location = New System.Drawing.Point(65, 18)Me.TextBox3.Name = "TextBox3"Me.TextBox3.Size = New System.Drawing.Size(260, 21)Me.TextBox3.TabIndex = 5''TextBox2'Me.TextBox2.Location = New System.Drawing.Point(65, 45)Me.TextBox2.Name = "TextBox2"Me.TextBox2.PasswordChar = Global.Microsoft.VisualBasic.ChrW(42)Me.TextBox2.Size = New System.Drawing.Size(260, 21)Me.TextBox2.TabIndex = 4''TextBox1'Me.TextBox1.Enabled = FalseMe.TextBox1.Location = New System.Drawing.Point(65, 72)Me.TextBox1.Name = "TextBox1"Me.TextBox1.PasswordChar = Global.Microsoft.VisualBasic.ChrW(42)Me.TextBox1.Size = New System.Drawing.Size(260, 21)Me.TextBox1.TabIndex = 3''Label3'Me.Label3.AutoSize = TrueMe.Label3.Location = New System.Drawing.Point(6, 75)Me.Label3.Name = "Label3"Me.Label3.Size = New System.Drawing.Size(53, 12)Me.Label3.TabIndex = 2Me.Label3.Text = "確認密碼"''Label2'Me.Label2.AutoSize = TrueMe.Label2.Location = New System.Drawing.Point(30, 48)Me.Label2.Name = "Label2"Me.Label2.Size = New System.Drawing.Size(29, 12)Me.Label2.TabIndex = 1Me.Label2.Text = "密碼"''Label1'Me.Label1.AutoSize = TrueMe.Label1.Location = New System.Drawing.Point(30, 21)Me.Label1.Name = "Label1"Me.Label1.Size = New System.Drawing.Size(29, 12)Me.Label1.TabIndex = 0Me.Label1.Text = "賬號"''Login'Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.FontMe.ClientSize = New System.Drawing.Size(862, 521)Me.Controls.Add(Me.TabControl1)Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingleMe.MaximizeBox = FalseMe.Name = "Login"Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreenMe.Text = "Login"Me.TabControl1.ResumeLayout(False)Me.LAR.ResumeLayout(False)Me.GroupBox2.ResumeLayout(False)Me.GroupBox1.ResumeLayout(False)Me.GroupBox1.PerformLayout()Me.ResumeLayout(False)End SubFriend WithEvents WebBrowser1 As WebBrowserFriend WithEvents TabControl1 As TabControlFriend WithEvents LAR As TabPageFriend WithEvents GroupBox2 As GroupBoxFriend WithEvents GroupBox1 As GroupBoxFriend WithEvents Button1 As ButtonFriend WithEvents CheckBox1 As CheckBoxFriend WithEvents RadioButton2 As RadioButtonFriend WithEvents RadioButton1 As RadioButtonFriend WithEvents Label5 As LabelFriend WithEvents TextBox3 As TextBoxFriend WithEvents TextBox2 As TextBoxFriend WithEvents TextBox1 As TextBoxFriend WithEvents Label3 As LabelFriend WithEvents Label2 As LabelFriend WithEvents Label1 As LabelFriend WithEvents TextBox4 As TextBoxFriend WithEvents Label6 As LabelFriend WithEvents Label4 As Label End Class至此,前端搞定
好啦,現在你可以用百度賬號登陸啦
4、根域名相同但是還是redirect_uri錯誤
回答:別想啦,根域名驗證是沒用的,只能通過校驗回調頁來搞
5、為什么沒有uid
回答:很簡單,百度的文檔太久了,實際獲得的是openid而不是uid
6、如何獲得code
回答:這是通過將code追加在redir_uri之后并重定向到這個uri來實現,所以你需要一個頁面來接受這個code
7、redir_uri后面能帶參數嗎
回答:能,這個百度還是做得到的,他會用&code=xxx的形式追加
8、如何獲得code
回答:其實沒有百度說的那么復雜,就是將內容直接發回給當前網址,你可以像發送POST或GET請求一樣,直接獲取返回的json包。但你需要注意,這里的redirect_uri必須和code中的redirect_uri的網址一樣(不包括參數),建議直接將獲取code與獲取token放在一個網址中(我就是這么做的)
9、可以正常獲取code,但是得不到token
回答:token中的redirect_uri必須是獲取code時填寫的uri
例如:在您獲取code時輸入http://sscczzjj.top/作為redirect_uri,那么在你獲取token也要用http://sscczzjj.top作為redirect_uri,而不能用http://sscczzjj.top/1作為uri(即使你將他們都添加到回調uri中)
10、只能填一個授權回調地址
回答:很抱歉,我沒研究出來這個問題如何解決,所以我干脆就只寫一個,嘿嘿嘿。
11、授權回調地址要填參數嗎
回答:不要填,也不需要,百度不會管這個回調地址后面的參數,他只關心地址
以上就是全部內容,如果您還有別的疑問,請留言
開發不容易,發文也不容易,獨自解決問題也不容易,客官您喜歡就三連一下吧
總結
以上是生活随笔為你收集整理的关于百度oauth2.0登陆的诸多问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux终端联网网速慢,Ubuntu
- 下一篇: 个人秋招经历总结