This repository has been archived by the owner on Oct 6, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathabout-oauth2.html
972 lines (923 loc) · 43.5 KB
/
about-oauth2.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title itemprop="name">关于 OAuth2 - 真白的年轮面包</title>
<meta name="description" content="">
<meta name="keywords" content="oauth2">
<meta name="robots" content="none">
<meta name="generator" content="Halo 1.5.4">
<link rel="shortcut icon" type="images/x-icon" href="https://i.loli.net/2020/08/21/zYQoZvxB6eclsR5.png">
<link rel='stylesheet' href='static/css/style.min.css' type='text/css' media='all'>
<link rel="stylesheet" href="static/css/css.css" media="noexist" onload="this.media='all'">
<link rel="stylesheet" href="static/css/font_2010950_sh9o0r7ahar.css" media="noexist" onload="this.media='all'">
<link rel="stylesheet" href="static/css/lib.css" media="noexist" onload="this.media='all'">
<link rel='stylesheet' href="static/css/highlight-Dracula.css" type="text/css" media="noexist" onload="this.media='all'">
<link rel="stylesheet" href="static/css/jqcloud.min.css" media="noexist" onload="this.media='all'">
<link rel="stylesheet" href="static/css/justifiedGallery.min.css" media="noexist" onload="this.media='all'">
<style type="text/css"> .site-top .lower nav { display: block !important; } /** * 图片资源 */ .video-play, .loadvideo { background-image: url(static/image/[email protected]) } .video-pause { background-image: url(static/image/[email protected]) } #video-add { background-image: url(static/image/[email protected]); } #loading-comments { background-image: url(static/image/disqus-preloader.svg); } .headertop.filter-grid:before { background-image: url(static/image/grid.png) } .headertop.filter-dot:before { background-image: url(static/image/dot.gif) } @media (max-width:860px) { .headertop.filter-dot:before { background-image: url(static/image/grid.png) } } .search-form.is-visible { background-image: url(static/image/iloli.gif); } #pagination .loading, #journals-pagination .loading { background-image: url(static/image/rotating-ball-o.svg); } #banner_wave_1 { background-image: url(static/image/wave1.png) repeat-x; } #banner_wave_2 { background-image: url(static/image/wave2.png) repeat-x; } /** 鼠标样式 */ a { cursor: url(http://127.0.0.1:8090/themes/LIlGG_Sakura/source/cursor/ayuda.cur), auto } a:active { cursor: url(http://127.0.0.1:8090/themes/LIlGG_Sakura/source/cursor/work.cur),alias } p { cursor: url(http://127.0.0.1:8090/themes/LIlGG_Sakura/source/cursor/texto.cur),auto } body { cursor: url(http://127.0.0.1:8090/themes/LIlGG_Sakura/source/cursor/normal.cur),auto; } .cd-top { cursor: url(http://127.0.0.1:8090/themes/LIlGG_Sakura/source/cursor/No_Disponible.cur),auto; } .botui-actions-buttons-button { cursor: url(http://127.0.0.1:8090/themes/LIlGG_Sakura/source/cursor/No_Disponible.cur),auto; } .button.botui-actions-buttons-button { cursor: url(http://127.0.0.1:8090/themes/LIlGG_Sakura/source/cursor/No_Disponible.cur),auto; } .highlight-wrap code { cursor: url(http://127.0.0.1:8090/themes/LIlGG_Sakura/source/cursor/texto.cur),auto } .cd-top { background: url(https://cdn.jsdelivr.net/gh/LIlGG/[email protected]/img/Sakura/images/scroll.png) no-repeat center; } .author-profile i, .post-like a, .post-share .show-share, .sub-text, .we-info a, span.sitename, .post-more i:hover, #pagination a:hover, .post-content a:hover, .float-content i:hover { color: #fe9600 } .feature i, .feature-title span, .download, .navigator i:hover, .links ul li:before, .ar-time i, span.ar-circle, .object, .comment .comment-reply-link, .siren-checkbox-radio:checked + .siren-checkbox-radioInput:after { background: #fe9600 } ::-webkit-scrollbar-thumb { background: #fe9600 } .download, .navigator i:hover, .link-title, .links ul li:hover, #pagination a:hover, .comment-respond input[type='submit']:hover { border-color: #fe9600 } .entry-content a:hover, .site-info a:hover, .comment h4 a, #comments-navi a.prev, #comments-navi a.next, .comment h4 a:hover, .site-top ul li a:hover, .entry-title a:hover, #archives-temp h3, span.page-numbers.current, .sorry li a:hover, .site-title a:hover, i.iconfont.js-toggle-search.iconsearch:hover, .comment-respond input[type='submit']:hover { color: #fe9600 } #nprogress .bar { background: #fe9600 } #nprogress .peg { box-shadow: 0 0 10px #fe9600, 0 0 5px #fe9600; } #pagination a:hover { border: 1px solid #fe9600; } #pagination a:hover { -webkit-box-shadow: 0 0 4px #fe9600; -moz-box-shadow: 0 0 4px #fe9600; -o-box-shadow: 0 0 4px #fe9600; box-shadow: 0 0 4px #fe9600 } .entry-content a:after { background-color: #fe9600 } .site-top ul li a:after { background-color: #fe9600 } .post-tags a:hover { color: #fe9600 } blockquote:before { color: #fe9600; } blockquote:after { color: #fe9600; } @media (max-width: 860px) { #mo-nav ul li a:hover { color: #fe9600; } } @media (min-width: 860px) { .chip-container { margin-top: -60px;; } } #gallery-filter { text-align: center; } .masonry-gallery .gallery-item { margin-bottom: 10px } /** 日志 */ .journals-line>li:nth-child(odd) .journal-label:after { border-right-color: #e6e6fa; } .at_button { background-color: #e6e6fa; color: #ffffff; } .at_button:hover { background: #f0ffff; color: #ffffff; } .journals-line>li:nth-child(odd) .journal-label { background: linear-gradient(60deg,rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35) 95%) 0% 0% / cover, url(https://i.loli.net/2021/11/16/ycwC4MGToI5ngHl.jpg) 0% 0% / cover; color: #ffffff; } .journals-line>li .journal-label { background: linear-gradient(60deg,rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35) 95%) 0% 0% / cover, url(https://i.loli.net/2021/11/16/ycwC4MGToI5ngHl.jpg) 0% 0% / cover; color: #ffffff; } /*黑夜模式控件透明度*/ body.dark .header-info, body.dark .top-social img { color:#fff; background:rgba(0,0,0,0.7); } body.dark .notification, body.dark .the-feature.from_left_and_right .info { background-color: rgba(0,0,0,0.7); } body.dark .skin-menu, body.dark .m-cd-top { background-color:rgba(0,0,0,0.7) !important; } /*黑夜模式图像亮度*/ body.dark img, body.dark .highlight-wrap, body.dark iframe, body.dark .entry-content .aplayer { filter:brightness(0.7); } /*黑夜模式主题色*/ body.dark .ar-time i, body.dark span.ar-circle, body.dark .scrollbar, body.dark .butterBar-message, body.dark .aplayer .aplayer-list ol li:hover { background: #fe9600 !important; } body.dark .aplayer .aplayer-list ol li.aplayer-list-light .aplayer-list-cur, body.dark .user-menu-option a:hover , body.dark .menu-list li:hover , body.dark .font-family-controls button:hover , body.dark .openNav .icon, body.dark .openNav .icon:before , body.dark .openNav .icon:after , body.dark .openNav .icon:after , body.dark .site-top ul li a:after { background-color: #fe9600; } body.dark #archives-temp h3, body.dark #moblieGoTop, body.dark #changskin, body.dark .the-feature.from_left_and_right a:hover .info p, body.dark .the-feature.from_left_and_right .info, body.dark .ins-section .ins-search-item:hover, body.dark .ins-section .ins-search-item:hover .ins-slug, body.dark .ins-section .ins-search-item:hover .ins-search-preview, body.dark .ins-section .ins-search-item:hover .iconfont , body.dark .float-content i:hover, body.dark .menhera-container .emoji-item:hover , body.dark .comment-respond .logged-in-as a:hover , body.dark .site-top ul li a:hover , body.dark i.iconfont.js-toggle-search.iconsearch:hover { color: #fe9600; } body.dark .aplayer .aplayer-info .aplayer-controller .aplayer-time .aplayer-icon:hover path { fill: #fe9600 } body.dark #moblieGoTop:hover , body.dark #changskin:hover { color: #fe9600; opacity:.8; } body.dark .focusinfo .header-tou img { box-shadow: inset 0 0 10px #fe9600; } </style> <!-- 评论模块独立样式 --> <style id="comment-style" type="text/css" media="noexist"> .halo-comment.dark button, .halo-comment.dark input, .halo-comment.dark select, .halo-comment.dark textarea, .halo-comment.dark i.iconfont.js-toggle-search.iconsearch, .halo-comment.dark .comment-textarea .input-label, .halo-comment.dark #emotion-toggle span, .halo-comment.dark .emotion-box, .halo-comment.dark .emotion-box .motion-container .emoji-item { color: #eee !important; } .halo-comment.dark .body p { color: #bebebe !important; } .halo-comment.dark input[type=color]:focus, .halo-comment.dark input[type=date]:focus, .halo-comment.dark input[type=datetime-local]:focus, .halo-comment.dark input[type=datetime]:focus, .halo-comment.dark input[type=email]:focus, .halo-comment.dark input[type=month]:focus, .halo-comment.dark input[type=number]:focus, .halo-comment.dark input[type=password]:focus, .halo-comment.dark input[type=range]:focus, .halo-comment.dark input[type=search]:focus, .halo-comment.dark input[type=tel]:focus, .halo-comment.dark input[type=text]:focus, .halo-comment.dark input[type=time]:focus, .halo-comment.dark input[type=url]:focus, .halo-comment.dark input[type=week]:focus, .halo-comment.dark textarea:focus { color: #eee !important; background-color: #31363b !important; } .halo-comment.dark .comment .info, .halo-comment.dark .comment .comment-time, .halo-comment.dark .comment-respond .logged-in-as, .halo-comment.dark .notification, .halo-comment.dark .comment-respond .logged-in-as a { color: #9499a8; } /** 说说评论样式 */ .halo-comment.journal { max-height: 600px; overflow: auto; } </style> <script type="text/javascript">
if (!!window.ActiveXObject || "ActiveXObject" in window) {
alert('请抛弃万恶的IE系列浏览器吧。');
}
</script>
</head>
<body class="hfeed chinese-font serif">
<section id="main-container">
<div class="headertop filter-dim">
<figure id="centerbg" class="centerbg" style="background-image: url(
static/image/XG5bOgFJek6v2NH.jpg
);
">
<div class="focusinfo">
<h1 class="center-text glitch" data-text="Shiina Mashiro">Shiina Mashiro</h1>
<div class="header-info no-select
info-desc"><p><i class="fa fa-quote-left"></i><span class="desc"> 此 生 无 悔 恋 真 白 ,来 世 愿 入 樱 花 庄 。</span><i class="fa fa-quote-right"></i></p>
<div class="top-social_v2">
<li id="bg-pre">
<img class="flipx" src="static/picture/next-b.svg">
</li>
<li>
<a href="javascript:;" target="_blank" class="social-github i18n" data-iname="icon_alt.github" data-iattr="title">
<img src="static/picture/github.png">
</a>
</li>
<li>
<a href="javascript:;" target="_blank" class="social-bili i18n" data-iname="icon_alt.bili" data-iattr="title">
<img src="static/picture/bilibili.png">
</a>
</li>
<li>
<a href="javascript:;" target="_blank" class="i18n" data-iname="icon_alt.twitter" data-iattr="title">
<img src="static/picture/twitter.png">
</a>
</li>
<li>
<a href="javascript:;" target="_blank" class="i18n" data-iname="icon_alt.stackoverflow" data-iattr="title">
<img src="static/picture/stackoverflow.svg">
</a>
</li>
<li id="bg-next">
<img src="static/picture/next-b.svg">
</li>
</div>
</div>
</div>
</figure>
<!-- 背景视频 -->
<div id="video-container">
<video id="bgvideo" class="video" data-id="" data-server="bilibili" data-url="/sakurasou.flv" width="auto" preload="auto" data-cid="" data-qn="64" data-vtype="0"></video>
<div id="video-btn" class="loadvideo videolive"></div>
<div id="video-add"></div>
<div class="video-stu"></div>
</div> <!-- 首页下拉箭头 -->
<div class="headertop-down faa-float animated" onclick="headertop_down()">
<span><i class="fa fa-chevron-down" aria-hidden="true"></i></span>
</div>
</div>
<div id="page" class="site wrapper">
<style>
/** Post start */
/** 文章页面导航栏自动收缩 */
.yya:not(.sabit) {
top: -100px;
transition: all .4s ease;
}
.sabit {
transition: all .4s ease;
}
/** 文章页首行缩进 */
/** Post end */
</style> <header class="site-header " role="banner">
<div class="site-top">
<div class="site-branding">
<div class="site-title">
<a href="index.html">
<img src="static/picture/VByUkvYofXhMP2H.png">
</a>
</div>
</div><!-- .site-branding -->
<div class="header-user-avatar">
<img src="static/picture/avatar.jpg" width="30" height="30">
<div class="header-user-menu">
<div class="herder-user-name">
<div class="herder-user-name-u">Parasomnia</div>
</div>
</div>
</div>
<div class="searchbox"><i class="iconfont js-toggle-search iconsearch icon-search"></i></div>
<div class="lower-cantiner">
<div class="lower">
<nav class="navbar">
<ul id="menu-menu-1" class="menu">
<li>
<a href="index.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-fort-awesome faa-tada" aria-hidden="true"></i>
首页
</span>
</a>
</li>
<li>
<a href="archives.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-archive faa-tada" aria-hidden="true"></i>
归档
</span>
</a>
</li>
<li>
<a href="categories.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-folder-open faa-tada" aria-hidden="true"></i>
分类
</span>
</a>
</li>
<li>
<a href="tags.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-tags faa-tada" aria-hidden="true"></i>
标签
</span>
</a>
</li>
<li>
<a href="journals.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-calendar-o faa-tada" aria-hidden="true"></i>
足迹
</span>
</a>
</li>
<li>
<a href="board.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-pencil faa-tada" aria-hidden="true"></i>
留言
</span>
</a>
</li>
<li>
<a href="links.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-link faa-shake" aria-hidden="true"></i>
友链
</span>
</a>
</li>
<li>
<a href="about.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-leaf faa-tada" aria-hidden="true"></i>
关于
</span>
</a>
</li>
<li>
<a href="javascript:;" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-rss faa-tada" aria-hidden="true"></i>
订阅
</span>
</a>
</li>
</ul> </nav>
<!-- #site-navigation -->
</div>
</div>
</div>
</header><!-- #masthead -->
<div class="pattern-center-blank"></div>
<div class="pattern-center single-center no-select">
<div class="pattern-attachment-img">
<img class="lazyload" data-src="https://s2.loli.net/2022/02/18/oI46Tj8nlOWLr5f.jpg" src="static/picture/orange.progress-bar-stripe-loader.svg" onerror="imgError(this)">
</div>
<header class="pattern-header single-header">
<h1 class="entry-title">关于 OAuth2</h1>
<p class="entry-census">
<span>
<a href="index.html">
<img src="static/picture/avatar.jpg">
</a>
</span>
<span>
<a href="index.html">Parasomnia</a>
</span>
<span class="bull">·</span><span class="i18n" data-iname="post.time" data-ivalue="2022-02-17"></span>
<span class="bull">·</span><span class="i18n" data-iname="post.edit_time" data-ivalue="2022-02-22"></span>
<span class="bull">·</span><span class="i18n" data-iname="post.visits" data-ivalue="337"></span>
</p>
</header>
</div>
<div id="content" class="site-content">
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<article id="post-262">
<div class="toc-container">
<div class="toc"></div>
</div>
<div class="entry-content">
<h1 id="oauth-2-是个啥">OAuth 2 是个啥</h1>
<p>OAuth 2 是一套用于授权的协议,但本身没有验证和用户管理的功能<br>
OAuth2 用于帮助 身份提供者 做权限认证</p>
<h1 id="角色与流程">角色与流程</h1>
<h2 id="角色">角色</h2>
<p>整个过程共有以下角色参与</p>
<ul>
<li>用户:一个具体的人或组织</li>
<li>客户端:需要访问资源的客户端,由用户来操作</li>
<li>授权服务器:身份验证的服务器,认证客户端并授权</li>
<li>资源服务器:存储资源的服务器,上面有客户端希望获取的内容</li>
</ul>
<p>以一个常见场景举例说明 —— 通过 微博 一键登录 百度网盘:</p>
<ol>
<li>首先我要有 微博 账号并且登录</li>
<li>我在 百度网盘 中点击 通过微博登录</li>
<li>会跳转到 微博的授权页面,询问是否允许 百度网盘 获取我微博的 昵称、头像信息</li>
<li>我点击允许后,百度网盘 从微博获取我的 昵称、头像等账号信息</li>
<li>自动跳转到 百度网盘页面并成功登录</li>
</ol>
<p>上面的例子中:</p>
<p>用户:我</p>
<p>客户端:百度网盘(是它要获取我微博的昵称和头像)</p>
<p>授权服务器:微博(它向我询问是否授权给百度网盘)</p>
<p>资源服务器:微博(存储我的昵称、头像信息)</p>
<h2 id="大致流程">大致流程</h2>
<p>根据上面的例子,可以把流程抽象出来</p>
<ol>
<li>客户端 向 授权服务器发起授权请求</li>
<li>授权服务器 向 客户端返回 授权码</li>
<li>客户端 携带 授权码请求 资源服务器</li>
<li>资源服务器 将 客户端 需要的信息提供给 客户端</li>
</ol>
<h1 id="四种授权许可方式">四种授权许可方式</h1>
<p>为什么上面会说是 大致流程呢?</p>
<p>因为客户端 从 授权服务器 获取 授权码 的过程有四种不同的方式</p>
<h2 id="授权码">授权码</h2>
<p>特点:功能最完整,流程最严密,通常外部服务都会通过这种方式来授权</p>
<p>客户端 向 授权服务器发起获取 授权码 code 的请求<br>
请求内容</p>
<table>
<thead>
<tr><th>字段名</th><th>作用</th><th>字段内容</th></tr>
</thead>
<tbody>
<tr><td>client_id</td><td>用于识别向哪个应用授权</td><td>唯一的应用id</td></tr>
<tr><td>redirect_uri</td><td>用于表示授权成功后的跳转页面</td><td>url</td></tr>
<tr><td>response_type</td><td>表示授权后客户端返回的类型</td><td>固定值 code 表示获取授权码</td></tr>
<tr><td>state</td><td>用于客户端验证 验证服务器 的身份,防止中间人攻击</td><td>随机字符串</td></tr>
</tbody>
</table>
<p>授权服务器 响应 客户端 请求,发送 code 给 客户端<br>
响应内容</p>
<table>
<thead>
<tr><th>字段名</th><th>作用</th></tr>
</thead>
<tbody>
<tr><td>code</td><td>授权码</td></tr>
<tr><td>state</td><td>与请求内容时发送的内容相同,用于防止中间人攻击</td></tr>
</tbody>
</table>
<p>客户端 向 授权服务器 发起请求,请求 accesstoken 和 refreshtoken<br>
请求内容</p>
<table>
<thead>
<tr><th>字段名</th><th>作用</th><th>字段内容</th></tr>
</thead>
<tbody>
<tr><td>code</td><td>证明客户端已经验证过身份</td><td>上轮响应中的授权码</td></tr>
<tr><td>client_id</td><td>用于识别客户端类型</td><td>固定值,从授权服务器处申请</td></tr>
<tr><td>client_secret</td><td>用于验证客户端身份</td><td>固定值,从授权服务器处申请</td></tr>
</tbody>
</table>
<p>授权服务器 响应 客户端请求,返回 accesstoken 和 refreshtoken<br>
响应内容</p>
<table>
<thead>
<tr><th>字段名</th><th>作用</th></tr>
</thead>
<tbody>
<tr><td>accesstoken</td><td>客户端用此 token 去 资源服务器 获取需要的资源,此 token 包含了 客户端身份、客户端权限(能访问哪些内容)、客户端访问有效期</td></tr>
<tr><td>refreshtoken</td><td>由于 accesstoken 可能会过期,为避免重新授权,可将此 token 发送给 授权服务器,快速获得新的 accesstoken</td></tr>
<tr><td>expire</td><td>过期时间,表示 accesstoken 的有效时间</td></tr>
</tbody>
</table>
<p>后面拿着 accesstoken 找 资源服务器 拿数据就是一样的流程了,不再赘述</p>
<h2 id="简化模式">简化模式</h2>
<p>特点:相较授权码更简单,但安全性不及授权码(token 对用户可见)</p>
<p>客户端 向 授权服务器 发起获取 accesstoken 的请求<br>
请求内容</p>
<table>
<thead>
<tr><th>字段名</th><th>作用</th><th>字段内容</th></tr>
</thead>
<tbody>
<tr><td>client_id</td><td>用于识别向哪个应用授权</td><td>唯一的应用id</td></tr>
<tr><td>redirect_uri</td><td>用于表示授权成功后的跳转页面</td><td>url</td></tr>
<tr><td>response_type</td><td>表示授权后客户端返回的类型</td><td>固定值 token 表示获取 accesstoken</td></tr>
<tr><td>state</td><td>用于客户端验证 验证服务器 的身份,防止中间人攻击</td><td>随机字符串</td></tr>
</tbody>
</table>
<p>授权服务器 响应 客户端请求,返回 accesstoken<br>
响应内容</p>
<table>
<thead>
<tr><th>字段名</th><th>作用</th></tr>
</thead>
<tbody>
<tr><td>accesstoken</td><td>客户端用此 token 去 资源服务器 获取需要的资源,此 token 包含了 客户端身份、客户端权限(能访问哪些内容)、客户端访问有效期</td></tr>
<tr><td>refreshtoken</td><td>由于 accesstoken 可能会过期,为避免重新授权,可将此 token 发送给 授权服务器,快速获得新的 accesstoken</td></tr>
<tr><td>expire</td><td>过期时间,表示 accesstoken 的有效时间</td></tr>
</tbody>
</table>
<h2 id="密码模式">密码模式</h2>
<p>特点:使用验证服务器的用户名密码登录</p>
<ol>
<li>客户端 请求 授权服务器的登录页面</li>
<li>用户 在 授权服务器上登录并授权(授权服务器验证账号密码是否正确)</li>
<li>授权服务器 向 客户端发送 accesstoken</li>
</ol>
<p>响应内容</p>
<table>
<thead>
<tr><th>字段名</th><th>作用</th></tr>
</thead>
<tbody>
<tr><td>accesstoken</td><td>客户端用此 token 去 资源服务器 获取需要的资源,此 token 包含了 客户端身份、客户端权限(能访问哪些内容)、客户端访问有效期</td></tr>
<tr><td>refreshtoken</td><td>由于 accesstoken 可能会过期,为避免重新授权,可将此 token 发送给 授权服务器,快速获得新的 accesstoken</td></tr>
<tr><td>expire</td><td>过期时间,表示 accesstoken 的有效时间</td></tr>
</tbody>
</table>
<h2 id="客户端模式">客户端模式</h2>
<p>特点:直接通过客户端的密钥直接获取 accesstoken,最方便(无需用户参与)也最危险</p>
<p>客户端 向 授权服务器 请求 accesstoken<br>
请求内容</p>
<table>
<thead>
<tr><th>字段名</th><th>作用</th></tr>
</thead>
<tbody>
<tr><td>grant_type</td><td>固定值 client_credentials 用于表示客户端授权</td></tr>
</tbody>
</table>
<p>授权服务器 向 客户端发送 accesstoken<br>
响应内容</p>
<table>
<thead>
<tr><th>字段名</th><th>作用</th></tr>
</thead>
<tbody>
<tr><td>accesstoken</td><td>客户端用此 token 去 资源服务器 获取需要的资源,此 token 包含了 客户端身份、客户端权限(能访问哪些内容)、客户端访问有效期</td></tr>
</tbody>
</table>
<h1 id="参考">参考</h1>
<ol>
<li><a href="javascript:;">bilibili 彻底理解 OAuth2 协议</a></li>
<li><a href="javascript:;">理解 OAuth2</a></li>
<li><a href="javascript:;">OAuth2 授权</a></li>
</ol>
<p>Q.E.D. <i class="fa fa-meetup" aria-hidden="true" style="color:#d34836"></i></p>
</div><!-- .entry-content -->
<div class="single-reward">
<div class="reward-open"><span class="i18n" data-iname="post.reward"></span>
<div class="reward-main">
<ul class="reward-row">
<li class="alipay-code"><img src="https://i.loli.net/2020/08/21/iotaKjFTfAsh6qE.jpg"></li>
<li class="wechat-code"><img src="static/picture/HfcFv3kP18y4TGW.jpg"></li>
</ul>
</div>
</div>
</div>
<footer class="post-footer">
<div class="post-license">
<a href="javascript:;" target="_blank" rel="nofollow">
<i class="fa fa-creative-commons" aria-hidden="true"></i>
<span class="i18n" data-iname="post.creative_commons"></span>
</a>
</div>
<div class="post-tags">
<i class="iconfont icon-tags"></i>
<a href="oauth2.html" rel="tag">oauth2</a>
</div>
<style>
.s-wechat {
position: relative;
}
.s-wechat .wechat-qrcode {
display: none;
border: 1px solid #eee;
position: absolute;
top: -215px;
left: -84px;
width: 200px;
height: 192px;
color: #666;
font-size: 12px;
text-align: center;
background-color: #fff;
box-shadow: 0 2px 10px #aaa;
transition: all 200ms;
-webkit-tansition: all 350ms;
-moz-transition: all 350ms
}
.s-wechat .wechat-qrcode.bottom {
top: 40px;
left: -84px
}
.s-wechat .wechat-qrcode.bottom:after {
display: none
}
.s-wechat .wechat-qrcode h4 {
font-weight: normal;
height: 26px;
line-height: 26px;
font-size: 12px;
background-color: #f3f3f3;
margin: 0;
padding: 0;
color: #777
}
.s-wechat .wechat-qrcode .qrcode {
width: 105px;
margin: 10px auto
}
.s-wechat .qrcode table {
margin: 0 !important
}
.s-wechat .wechat-qrcode .help p {
font-weight: normal;
line-height: 16px;
padding: 0;
margin: 0
}
.s-wechat .wechat-qrcode:after {
content: '';
position: absolute;
left: 50%;
margin-left: -6px;
bottom: -13px;
width: 0;
height: 0;
border-width: 8px 6px 6px 6px;
border-style: solid;
border-color: #fff transparent transparent transparent
}
.s-wechat:hover .wechat-qrcode {
display: block
}
.s-wechat .wechat-qrcode img {
width: auto;
height: auto;
}
</style>
<div class="post-share">
<ul class="social-share sharehidden">
<li>
<a href="javascript:;" onclick="window.open(this.href, 'weibo-share', 'width=490,height=700');return false;" class="s-weibo i18n" data-iname="share.weibo" data-iattr="title">
<img src="static/picture/weibo.png">
</a>
</li>
<li>
<a href="javascript:;" onclick="window.open(this.href, 'qq-share', 'width=730,height=500');return false;" class="s-qq i18n" data-iname="share.qq" data-iattr="title">
<img src="static/picture/qq.png">
</a>
</li>
<li>
<a href="javascript:" class="s-wechat">
<div class="wechat-qrcode">
<h4 class="i18n" data-iname="share.wechat.qcode_title"></h4>
<div id="qrcode" class="qrcode" title="http://127.0.0.1:8090/archives/about-oauth2" data-url="http://127.0.0.1:8090/archives/about-oauth2"></div>
<div class="help">
<p class="i18n" data-iname="share.wechat.help_1"></p>
<p class="i18n" data-iname="share.wechat.help_2"></p>
</div>
</div>
<img src="static/picture/wechat.png">
</a>
</li>
<li>
<a href="javascript:;" onclick="window.open(this.href, 'douban-share', 'width=490,height=600');return false;" class="s-douban i18n" data-iname="share.douban" data-iattr="title">
<img src="static/picture/douban.png">
</a>
</li>
<li>
<a href="javascript:;" onclick="window.open(this.href, 'qzone-share', 'width=490,height=600');return false;" class="s-qzone i18n" data-iname="share.qzone" data-iattr="title">
<img src="static/picture/qzone.png">
</a>
</li>
<li>
<a href="javascript:;" onclick="window.open(this.href, 'linkedin-share', 'width=490,height=600');return false;" class="s-linkedin i18n" data-iname="share.linkedin" data-iattr="title">
<img src="static/picture/linkedin.png">
</a>
</li>
</ul>
<i class="iconfont show-share icon-forward"></i>
</div>
</footer><!-- .entry-footer -->
</article><!-- #post-## -->
<section class="post-squares nextprev">
<div class="post-nepre half previous">
<a href="private-cloud-hardware.html" rel="prev">
<div class="background" style="background-image:url('static/image/1CauizoMwvZAG7U.png');"></div>
<span class="label i18n" data-iname="post.prev"></span><div class="info"><h3>搭建私有云 — 硬件选型</h3><hr></div>
</a>
</div>
<div class="post-nepre half next">
<a href="about-my-keyboard.html" rel="next">
<div class="background" style="background-image:url('static/image/uxPWAryqGBSYUi6.jpg');"></div>
<span class="label i18n" data-iname="post.next"></span><div class="info"><h3>说说我用过的几款键盘</h3><hr></div>
</a>
</div>
</section>
<section class="author-profile">
<div class="info" itemprop="author" itemscope="" itemtype="http://schema.org/Person">
<a href="index.html" class="profile gravatar"><img src="static/picture/avatar.jpg" itemprop="image" alt="Parasomnia" height="70" width="70"></a>
<div class="meta">
<span class="title">Parasomnia</span>
<h3 itemprop="name">
<a href="index.html" itemprop="url" rel="author">Parasomnia</a>
</h3>
</div>
</div>
<hr>
<p><i class="iconfont icon-pencil"></i>
<span> 此 生 无 悔 恋 真 白 ,来 世 愿 入 樱 花 庄 。</span>
</p>
</section>
</main><!-- #main -->
</div><!-- #primary -->
</div><!-- #content -->
<!-- 定义可变属性,会根据页面的改变而变化 -->
<script type='text/javascript'>
/* <![CDATA[ */
var PageAttr = {
"metas": {
},
"isPost": "true",
"postWordCount": "2,143",
"postEditTime": "2022-02-22 19:32:09"
}
/* ]]> */
</script>
</div><!-- #page Pjax container-->
<footer id="colophon" class="site-footer" role="contentinfo">
<div class="site-info">
<div class="footertext">
<p class="foo-logo" style="background-image: url('static/image/sakura.svg');"></p>
ねえ、あなたは何になりたいの色?
</div>
<div class="footer-device">
<p style="font-family: 'Ubuntu', sans-serif;">
<span>Powered
<i class="fa fa-vimeo animated" style="color: #e74c3c;"></i>
by
<a rel="me" target="_blank" href="javascript:;" title="一款优秀的开源博客内容发布系统" style="text-decoration:none;">Halo</a>
</span>
•
<span>Crafted with
<i class="fa fa-heart animated" style="color: #e74c3c;"></i>
by
<a rel="me" target="_blank" href="javascript:;" style="text-decoration:none;">LIlGG</a>
</span>
</p>
<p>
© 2022 Parasomnia
</p>
</div>
</div><!-- .site-info -->
</footer><!-- #colophon -->
<div class="openNav">
<div class="iconflat">
<div class="icon"></div>
</div>
<div class="site-branding">
<div class="site-title">
<a href="index.html">
<img src="static/picture/VByUkvYofXhMP2H.png">
</a>
</div>
</div>
</div><!-- m-nav-bar -->
</section><!-- #section -->
<!-- m-nav-center -->
<div id="mo-nav">
<div class="m-avatar">
<img src="static/picture/avatar.jpg">
</div>
<p style="text-align: center; color: #333; font-weight: 900; font-family: 'Ubuntu', sans-serif; letter-spacing: 1.5px">Shiina Mashiro</p>
<p style="display:flex; justify-content:center;">
<a href="javascript:;" class="social social-twitter" target="_blank"><img src="static/picture/twitter.png" width="18"></a>
<a href="javascript:;" class="social social-github" target="_blank"><img src="static/picture/github.png" width="18"></a>
<a href="javascript:;" class="social social-bili" target="_blank"><img src="static/picture/bilibili.png" width="18"></a>
</p>
<div class="m-search">
<form class="m-search-form" method="get" action="/search" role="search">
<input class="m-search-input" type="search" name="keyword" placeholder="搜索..." required="">
</form>
</div>
<ul id="menu-menu-1" class="menu">
<li>
<a href="index.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-fort-awesome faa-tada" aria-hidden="true"></i>
首页
</span>
</a>
</li>
<li>
<a href="archives.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-archive faa-tada" aria-hidden="true"></i>
归档
</span>
</a>
</li>
<li>
<a href="categories.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-folder-open faa-tada" aria-hidden="true"></i>
分类
</span>
</a>
</li>
<li>
<a href="tags.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-tags faa-tada" aria-hidden="true"></i>
标签
</span>
</a>
</li>
<li>
<a href="journals.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-calendar-o faa-tada" aria-hidden="true"></i>
足迹
</span>
</a>
</li>
<li>
<a href="board.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-pencil faa-tada" aria-hidden="true"></i>
留言
</span>
</a>
</li>
<li>
<a href="links.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-link faa-shake" aria-hidden="true"></i>
友链
</span>
</a>
</li>
<li>
<a href="about.html" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-leaf faa-tada" aria-hidden="true"></i>
关于
</span>
</a>
</li>
<li>
<a href="javascript:;" target="_self">
<span class="faa-parent animated-hover">
<i class="fa fa-rss faa-tada" aria-hidden="true"></i>
订阅
</span>
</a>
</li>
</ul> <p class="m-footer">© 2022 Parasomnia</p>
</div><!-- m-nav-center end -->
<a href="#" class="cd-top"></a>
<!-- m-cd-top start -->
<button class="m-cd-top" title="Go to top">
<i class="fa fa-chevron-up" aria-hidden="true"></i>
</button>
<!-- m-cd-top end -->
<!-- search start -->
<form class="js-search search-form search-form--modal" method="get" action="/search" role="search">
<div class="search-form__inner">
<div>
<p class="micro mb-">输入后按回车搜索 ...</p>
<i class="iconfont icon-search"></i>
<input class="text-input" type="search" name="keyword" placeholder="Search" required="">
</div>
</div>
<div class="search_close"></div>
</form>
<!-- search end -->
<!-- aplayer start -->
<!-- aplayer end -->
<!-- theme-change start -->
<div class="changeSkin-gear no-select">
<div class="keys">
<span id="open-skinMenu">切换主题 | SCHEME TOOL <i class="iconfont icon-gear inline-block rotating"></i></span>
</div>
</div>
<div class="skin-menu no-select">
<div class="theme-controls row-container">
<ul class="menu-list">
<li id="bg_0" data-text="默认是纯洁的白色~">
<i class="fa fa-television" aria-hidden="true"></i>
</li>
<li id="bg_1" data-text="樱花飞舞~">
<i class="iconfont icon-sakura" aria-hidden="true"></i>
</li>
<li id="bg_2" data-text="格子控!">
<i class="fa fa-slack" aria-hidden="true"></i>
</li>
<li id="bg_3" data-text="小点点~">
<i class="iconfont icon-dots" aria-hidden="true"></i>
</li>
<li id="bg_4" data-text="充满力量的橙色">
<i class="fa fa-optin-monster" aria-hidden="true"></i>
</li>
<li id="bg_5" data-text="pixiv主题~">
<i class="iconfont icon-pixiv" aria-hidden="true"></i>
</li>
<li id="bg_6" data-text="真白像素风格">
<i class="fa fa-smile-o" aria-hidden="true"></i>
</li>
<li id="bg_7" data-text="关灯!">
<i class="fa fa-moon-o" aria-hidden="true"></i>
</li>
</ul>
</div>
</div>
<!-- theme-change end -->
<!-- 定义全局属性 -->
<script type='text/javascript'>
/* <![CDATA[ */
var Poi = {
"pjax":"true",
"windowheight":"auto",
"ajaxurl":"http://127.0.0.1:8090",
"resBaseUrl": "http://127.0.0.1:8090/themes/LIlGG_Sakura",
"formpostion":"bottom",
"toc": "true",
"codeLine": "true",
"themeChange": "true",
"headFocus": "true",
"bgvideo": "true",
"tagRandomColorMin": "0.999",
"tagRandomColorMax": "1",
"nickname": "Parasomnia",
"sitename": "真白的年轮面包",
"themeBase": "http://127.0.0.1:8090/themes/LIlGG_Sakura",
"openToast": "true",
"toastWidth": 260,
"toastHeight": 60,
"toastTop": "top",
"toastBackground": "#fe9600",
"toastColor": "#ffffff",
"toastFontSize": 14,
"copyMonitor": "true",
"copyrightNotice": "true",
"photosStyle": "justify",
"photosGutter": 10,
"tocDepth": 0,
"i18n": "auto",
"coverNum": "5",
"rimageUrl": "https://api.lixingyong.com/api/images",
"coverOpen": "",
"meEmail": "",
"defaultTheme": "bg_0",
"defaultGroup": "",
"isPostWordCountToast": "",
"isPostEditTimeToast": "",
"postWordCountToastNormal": "文章篇幅适中,可以放心阅读。",
"postWordCountToastMedium": "文章内容较长,请提前准备好咖啡!!!",
"postWordCountToastDifficulty": "文章内容很长,建议分段阅读。",
"postEditTimeToastNormal": "近期有所更新,请放心阅读!",
"postEditTimeToastMedium": "文章距上次编辑时间较远,部分内容可能已经过时!",
"postEditTimeToastDifficulty": "文章内容已经很陈旧了,也许不再适用!",
"journalLikes": "",
"journalComment": "",
};
var bgConfig = {
"bg_0": {
"id": "0",
"name": "white",
"desc": "默认是纯洁的白色~",
"url": "",
"strategy": "none",
"isNight": ""
},
"bg_1": {
"id": "1",
"name": "sakura",
"desc": "樱花飞舞~",
"url": "https://view.lixingyong.com/images/2020/07/23/695cc3a80b21ee7f18bd731824ab9638.png",
"strategy": "none",
"isNight": ""
},
"bg_2": {
"id": "2",
"name": "gribs",
"desc": "格子控!",
"url": "https://view.lixingyong.com/images/2020/07/23/defc1b6783cd16774900517d3b38ded7.jpg",
"strategy": "none",
"isNight": ""
},
"bg_3": {
"id": "3",
"name": "KAdots",
"desc": "小点点~",
"url": "https://view.lixingyong.com/images/2020/07/23/kyotoanimation.png",
"strategy": "none",
"isNight": ""
},
"bg_4": {
"id": "4",
"name": "totem",
"desc": "充满力量的橙色",
"url": "https://view.lixingyong.com/images/2020/07/23/little-monster.png",
"strategy": "none",
"isNight": ""
},
"bg_5": {
"id": "5",
"name": "pixiv",
"desc": "pixiv主题~",
"url": "https://view.lixingyong.com/images/2020/07/23/star02.png",
"strategy": "none",
"isNight": ""
},
"bg_6": {
"id": "6",
"name": "Mashiro pixel",
"desc": "真白像素风格",
"url": "https://i.loli.net/2020/09/30/YbVaGTp8UkR4gHP.png",
"strategy": "cover",
"isNight": ""
},
"bg_7": {
"id": "7",
"name": "dark",
"desc": "关灯!",
"url": "",
"strategy": "none",
"isNight": "true"
},
};
/* ]]> */
</script>
<script type='text/javascript' src='static/js/utils.min.js'></script>
<script type="text/javascript" src="static/js/lazysizes.min.js" async=""></script>
<script type="text/javascript" src="static/js/lib.js"></script>
<!-- 相册 -->
<script src="static/js/jquery.justifiedGallery.min.js" async=""></script>
<script type="text/javascript" src="static/js/highlight.pack.js" defer=""></script>
<script type="text/javascript" src="static/js/highlightjs-line-numbers.min.js" defer=""></script>
<script src="static/js/tocbot.min.js" defer=""></script>
<script src="static/js/sakura-comment.min.js" defer=""></script>
<script src="static/js/jqcloud.min.js" defer=""></script>
<script type='text/javascript'>
var wordcloud = [
{'text': '网络', 'weight': '1', 'link': 'http://127.0.0.1:8090/tags/网络'},
{'text': '文件系统', 'weight': '1', 'link': 'http://127.0.0.1:8090/tags/文件系统'},
{'text': '硬件', 'weight': '1', 'link': 'http://127.0.0.1:8090/tags/硬件'},
{'text': 'oauth2', 'weight': '1', 'link': 'http://127.0.0.1:8090/tags/oauth2'},
{'text': 'ssh', 'weight': '1', 'link': 'http://127.0.0.1:8090/tags/ssh'},
{'text': 'python', 'weight': '3', 'link': 'http://127.0.0.1:8090/tags/python'},
{'text': '中间件', 'weight': '1', 'link': 'http://127.0.0.1:8090/tags/中间件'},
{'text': 'http', 'weight': '1', 'link': 'http://127.0.0.1:8090/tags/http'},
{'text': '算法', 'weight': '3', 'link': 'http://127.0.0.1:8090/tags/算法'},
{'text': 'golang', 'weight': '17', 'link': 'http://127.0.0.1:8090/tags/golang'},
{'text': 'android', 'weight': '2', 'link': 'http://127.0.0.1:8090/tags/android'},
{'text': '认知', 'weight': '3', 'link': 'http://127.0.0.1:8090/tags/认知'},
{'text': 'git', 'weight': '3', 'link': 'http://127.0.0.1:8090/tags/git'},
{'text': 'hard times', 'weight': '6', 'link': 'http://127.0.0.1:8090/tags/hardtime'},
{'text': '心理', 'weight': '5', 'link': 'http://127.0.0.1:8090/tags/心理'},
{'text': 'java', 'weight': '2', 'link': 'http://127.0.0.1:8090/tags/java'},
{'text': '想法', 'weight': '8', 'link': 'http://127.0.0.1:8090/tags/想法'},
{'text': '年终总结', 'weight': '3', 'link': 'http://127.0.0.1:8090/tags/年终总结'},
{'text': '读后感', 'weight': '6', 'link': 'http://127.0.0.1:8090/tags/读后感'},
{'text': 'oracle-db', 'weight': '1', 'link': 'http://127.0.0.1:8090/tags/oracle-db'},
{'text': 'nginx', 'weight': '3', 'link': 'http://127.0.0.1:8090/tags/nginx'},
{'text': '性能测试', 'weight': '1', 'link': 'http://127.0.0.1:8090/tags/性能测试'},
{'text': 'linux', 'weight': '5', 'link': 'http://127.0.0.1:8090/tags/linux'},
{'text': 'https', 'weight': '2', 'link': 'http://127.0.0.1:8090/tags/https'},
]
</script>
<script src="static/js/echarts.min.js" async="" defer=""></script>
<script type='text/javascript'>
var categoryRadar = {
'闲聊': '23',
'极客': '6',
'起飞': '9',
'技术': '39',
}
</script>
<script type='text/javascript' src='static/js/qrcode.min.js' defer=""></script>
<script type='text/javascript' src='static/js/index.js' defer=""></script>
<script type='text/javascript' src='static/js/i18n.min.js' defer=""></script>
<script type='text/javascript' src='static/js/app.min.js'></script>
<div class="site-statistics">
</div>
</body>
</html>