.NET、GitHubAPI与Jekyll博客开发指南
立即解锁
发布时间: 2025-08-20 01:37:12 阅读量: 1 订阅数: 2 


构建工具与GitHub:定制您的工作流程
# .NET、GitHub API 与 Jekyll 博客开发指南
## 1. .NET 与 GitHub API 交互
### 1.1 Octokit 与异步操作
在使用 Octokit 进行网络查询时,由于查询可能需要一些时间,我们需要使用 `await` 关键字来等待查询结果。Nancy 请求处理程序可以简单地返回一个文本字符串,该字符串将被浏览器标记为 HTML 进行显示。例如,我们可以返回包含用户姓名和关注者数量的简单字符串。
`async` 和 `await` 关键字是 .NET 4.0 引入的重要特性,它们封装了一系列在事件循环上运行的函数。代码看起来是按顺序执行的,但实际上当遇到 `await` 关键字时,系统会启动一个异步请求,并将控制权返回给主事件循环。一旦请求完成且承诺得到履行,事件循环将回调到期望 `await` 关键字返回值的代码中,同时保留所有作用域变量。这使得我们可以像编写同步代码一样编写异步代码,是 C# 受开发者喜爱的特性之一。
### 1.2 OAuth 流程
为了发布提交状态更新,我们需要向用户请求权限。除了询问用户名和密码(这会给予过多控制权,并且如果启用了双因素身份验证可能还不够),唯一的方法是使用 OAuth。以下是从我们的小服务器角度来看的 OAuth 流程:
1. **获取授权令牌**:如果我们没有令牌或现有令牌已过期,我们需要向 GitHub 请求一个。这涉及将用户的浏览器重定向到 GitHub API 端点,并将所需的权限和其他详细信息作为查询参数传递。
2. **用户授权**:GitHub 通过用户的浏览器告知用户某个应用程序正在请求某些权限,用户可以选择允许或拒绝。
3. **获取授权码**:如果用户允许访问,其浏览器将被重定向到我们在步骤 1 中指定的 URL,并传递一个“代码”作为查询参数。这不是我们想要的访问令牌,而是获取令牌的限时密钥。
4. **获取访问令牌**:在处理此请求的处理程序中,我们可以使用 REST API 获取实际的 OAuth 访问令牌,并将其存储在安全的地方。
5. **使用 GitHub API**:现在我们拥有了权限,可以以经过身份验证的模式使用 GitHub API。
这个流程虽然看起来复杂,但它实现了几个目标:权限可以被限定范围,整个交换过程是安全的,并且访问令牌永远不会传输到用户的浏览器,避免了一类安全漏洞。
### 1.3 代码实现
#### 1.3.1 存储令牌
我们将使用 Nancy 的会话功能将令牌存储在 cookie 中。首先,我们需要添加一个引导程序类来启用会话功能:
```csharp
using Nancy;
using Nancy.Bootstrapper;
using Nancy.Session;
using Nancy.TinyIoc;
namespace NancyApp
{
public class Bootstrapper : DefaultNancyBootstrapper
{
protected override void ApplicationStartup(TinyIoCContainer container,
IPipelines pipelines)
{
CookieBasedSessions.Enable(pipelines);
}
}
}
```
#### 1.3.2 嵌入应用程序 ID 和密钥
我们需要将应用程序的 ID 和密钥嵌入到代码中。如果没有应用程序,可以访问 https://github.com/settings/developers 创建一个,并使用 http://localhost:8080/authorize 作为回调 URL:
```csharp
private const string clientId = "<clientId>";
private const string clientSecret = "<clientSecret>";
```
#### 1.3.3 启动 OAuth 流程
我们需要一个辅助方法来启动 OAuth 流程:
```csharp
private Response RedirectToOAuth()
{
var csrf = Guid.NewGuid().ToString();
Session["CSRF:State"] = csrf;
Session["OrigUrl"] = this.Request.Path;
var request = new OauthLoginRequest(clientId)
{
Scopes = { "repo:status" },
State = csrf,
};
var oauthLoginUrl = client.Oauth.GetGitHubLoginUrl(request);
return Response.AsRedirect(oauthLoginUrl.ToString());
}
```
#### 1.3.4 处理授权回调
在 GitHub 应用程序设置中,我们指定了授权 URL。当用户授予应用程序权限时,GitHub 将用户的浏览器重定向到该 URL。以下是该端点的处理程序:
```csharp
Get["/authorize", true] = async (parms, ct) =>
{
var csrf = Session["CSRF:State"] as string;
Session.Delete("CSRF:State");
if (csrf != Request.Query["state"])
{
return HttpStatusCode.Unauthorized;
}
var queryCode = Request.Query["code"].ToString();
var tokenReq = new OauthTokenRequest(clientId,
clientSecret,
queryCode);
var token = await client.Oauth.CreateAccessToken(tokenReq);
Session["accessToken"] = token.AccessToken;
var origUrl = Session["OrigUrl"].ToString();
Session.Delete("OrigUrl");
return Response.AsRedirect(origUrl);
};
```
#### 1.3.5 测试授权处理
我们可以添加一个测试方法来
0
0
复制全文
相关推荐









